Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Остановка потока [D7, XP]


Страницы:   1 2

Fr ©   (2010-08-30 18:10:00) 

Как правильно остановить поток? Создается при коннекте к ServerSocket и с периодичностью ~30с делает что-то. Как правильно завершить его работу посередине засыпания (когда ClientSocket.Active уже false,  а Sleep(30000) только начал выполняться)?

procedure T...Thread.Execute;
...
begin
 while ...ClientSocket.Active do begin
      ...
   Synchronize(...);
   Sleep(30000);
 end;
end;


DVM   (2010-08-30 20:00:00) [21]


> Здесь тоже не надо самому заботиться об уничтожении потока?

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


Fr   (2010-08-30 19:39:00) [22]

Нет, я создал потомка от TThread:


TLagThread = class(TThread)
 private
   LagString: integer;
   procedure SetLag;
 protected
   procedure Execute; override;
 end;

procedure TLagThread.Execute;
var
 j,i,x: integer;
begin
 while ...ClientSocket.Active do begin
   try
     j:=0;
     f...IdIcmpClient1.ReceiveTimeout:=3000;
     ...IdIcmpClient1.Host:=...ClientSocket.Host;
     for i:=0 to 4 do begin
       ...IdIcmpClient1.Ping();
       j:=j+...IdIcmpClient1.ReplyStatus.MsRoundTripTime;
     end;
     LagString:=Round(j/5);
   except
     ...StatusBar1.Panels[1].Text:='';
   end;
   Synchronize(SetLag);
   for x:=0 to 29 do begin
     Sleep(1000);
     if LagThread.Terminated then Exit;
   end;
 end;
end;


Заменил Sleep(30000) на:

for x:=0 to 29 do begin
  Sleep(1000);
  if LagThread.Terminated then Exit;
end;


Здесь тоже не надо самому заботиться об уничтожении потока? При выходе из Execute он все сделает сам?


Сергей М.   (2010-08-30 18:43:00) [23]


> Fr   (30.08.10 18:36) [10]


Если ты о TServerClientThread, то тебя это заботить не должно - тред будет уничтожен самим TServerSocket при его деактивации.
Твое дело - в теле ClientExecute оперативно среагировать на флаг Terminated = True или на ClientSocket.Connected = False, чтобы по факту этих событий закруглить выполнение метода ClientExecute как можно быстрее.


Fr   (2010-08-30 18:39:00) [24]


> Сергей М. ©   (30.08.10 18:33) [8]

Попытался реализовать после ответа на http://www.delphimaster.ru/cgi-bin/forum.pl?id=1281765808&n=18


Fr   (2010-08-30 18:36:00) [25]


> Сергей М. ©   (30.08.10 18:34) [9]

Тогда как его гарантированно уничтожить?


Сергей М.   (2010-08-30 18:34:00) [26]


> Fr   (30.08.10 18:32) [7]


Не совсем.
Поток м.б. передан в пул свободных, т.е. ждущих своей очереди на обслуживание очередного установленного соединения.


Сергей М.   (2010-08-30 18:33:00) [27]

Ну так на то есть таймеры и таймауты ..
Зачем же намертво усыплять поток ?


Fr   (2010-08-30 18:32:00) [28]

Я правильно понимаю, что по выходу из процедуры Execute, поток самоуничтожается?


Fr   (2010-08-30 18:30:00) [29]


> Сергей М. ©   (30.08.10 18:23) [5]

Да, мне в этом потоке надо выполнить раз в 30с действие и забыть о нем на след. 30с


Сергей М.   (2010-08-30 18:23:00) [30]

А какой тайный смысл в этих 30-ти сикундах "спанья" ?
Твоему треду нечем заняться и он решил 30 секунд поспать богатырским сном ?


DVM   (2010-08-30 18:22:00) [31]


> Fr   (30.08.10 18:18) [3]

Да есть разные варианты, от банального цикла включающего в себя проверку Terminated на каждой итерации и Sleep но с гораздо меньшим интервалом или что то в духе CreateWaitableTimer + SetWaitableTimer + WaitForSingleObject


Fr   (2010-08-30 18:18:00) [32]


> DVM ©   (30.08.10 18:15) [1]

Чем?


Fr   (2010-08-30 18:17:00) [33]

Или не надо заморачиваться с Terminate, Free, ...:=nil, а поток сам завершит свою работу после того, как проснется в .Execute и освободит все задействованные ресурсы самостоятельно?


DVM   (2010-08-30 18:15:00) [34]

Убрать Sleep, его есть чем заменить.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо