Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Автоконнект через IdIRC, Как подключаться снова при разрыве? 
:(
    Опции темы
Elfix
Дата 2.8.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Привет.  Возникла проблема при использовании компонента IdIRC. Вся функциональность программы уже реализована, но теперь возникла проблема. При падении сервера, программа должна сделать попытки соединения на него до тех пор, пока оно не будет установлено. Я реализовал такой подход:
Код

procedure ConnectToServer;
begin
 while not Form1.IRC.Connected do
  Form1.IRC.Connect();
 EndThread(0);
end;

procedure TForm1.IRCDisconnect(Sender: TObject);
var
 id: Cardinal;
begin
 BeginThread(0, 0, @ConnectToServer, 0, 0, Id);
end;
Но соединение автоматически не возобновляется. В чем может быть проблема?
PM MAIL   Вверх
Elfix
Дата 3.8.2007, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Ну, товарищи прогеры. Неужели никто не болел этим?
Я просто вообще не догоняю в чем может быть причина такого бездействия со стороны компонента.
PM MAIL   Вверх
dumb
Дата 3.8.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



Цитата(Elfix @  3.8.2007,  00:03 Найти цитируемый пост)
не догоняю в чем может быть причина такого бездействия со стороны компонента. 
сам придумал поток создавать? таймер обычный чем не подошел? а не работает потому, что из потока обращаешься к визуальным компонентам.

изучай:
Многопоточность - как это делается в Дельфи.
Пример простого многопоточного приложения.
PM MAIL   Вверх
Elfix
Дата 3.8.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Гм. IdIRC - компонент невизуальный :(
У меня вся программа в таких потоках, все корректно работает. А вот автоконнект реализовать так и не получилось.
Тамер думаю будет работать неэффективно.
PM MAIL   Вверх
Elfix
Дата 3.8.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Компонент IdIRC - невизуальный. У меня вся функциональность программы реализована как раз через работу с этим компонентом в основном и дополнительных потоках. Использовать таймер, думаю будет неэффективно. Нужно чтобы программа не ежеминутно коннектилась к серверу, а незамедлительно, как только сервер стал доступен.

Это сообщение отредактировал(а) Elfix - 3.8.2007, 12:08
PM MAIL   Вверх
dumb
Дата 3.8.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 5
Всего: 158



визуальный-невизуальный... нельзя компонентами рулить из разных потоков, не используя синхронизацию. в твоем случае проблема "высосана из пальца", а использование потоков "притянуто за уши".

простейший код полностью решает "проблему" реконнекта:
Код

procedure TForm1.IRCConnect(Sender: TObject);
begin
 Timer1.Enabled := false;
 Timer1.Interval := 1;
end;

procedure TForm1.IRCDisconnect(Sender: TObject);
begin
 Timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Timer1.Interval := 5000;
 IRC.Connect();
end;


Цитата(Elfix @  3.8.2007,  12:08 Найти цитируемый пост)
Использовать таймер, думаю будет неэффективно.
обоснуй.
PM MAIL   Вверх
Elfix
Дата 4.8.2007, 05:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



Код не работает. Таймер не включается. Я думаю проблема в том, что событие Disconnect обрабатывается только когда сам клиент вызывает Disconnect, а у меня несколько другая задача - попытаться восстановить связь тогда, когда сервер, наконец, возобновит работу.

О таймере. Я думал, что будет предложена несколько другая реализация, когда таймер крутится постоянно, проверяя соединение с сервером. Впринципе меня этот способ бы тоже устроил, но все таки работу с потоком я рассматриваю как наиболее красивый вариант. Никогда при использовании потоков с невизуальными компонентами у меня проблем не возникало. Единственное, прочитав Рихтера наверно убрал бы из процедуры ConnectToServer функцию EndThread.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.