![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Остановка потока [D7, XP]
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, его есть чем заменить.