Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Автоконнект через IdIRC


Автор: Elfix 2.8.2007, 19:55
Привет.  Возникла проблема при использовании компонента 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;
Но соединение автоматически не возобновляется. В чем может быть проблема?

Автор: Elfix 3.8.2007, 00:03
Ну, товарищи прогеры. Неужели никто не болел этим?
Я просто вообще не догоняю в чем может быть причина такого бездействия со стороны компонента.

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

изучай:
http://forum.vingrad.ru/forum/topic-60076.html
http://forum.vingrad.ru/forum/topic-163841/kw-tthread-%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B8-%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D0%BF%D0%BE%D1%82%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C-threads.html

Автор: Elfix 3.8.2007, 11:38
Гм. IdIRC - компонент невизуальный :(
У меня вся программа в таких потоках, все корректно работает. А вот автоконнект реализовать так и не получилось.
Тамер думаю будет работать неэффективно.

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

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

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

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 Найти цитируемый пост)
Использовать таймер, думаю будет неэффективно.
обоснуй.

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

О таймере. Я думал, что будет предложена несколько другая реализация, когда таймер крутится постоянно, проверяя соединение с сервером. Впринципе меня этот способ бы тоже устроил, но все таки работу с потоком я рассматриваю как наиболее красивый вариант. Никогда при использовании потоков с невизуальными компонентами у меня проблем не возникало. Единственное, прочитав Рихтера наверно убрал бы из процедуры ConnectToServer функцию EndThread.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)