Форум: "Начинающим";
Текущий архив: 2010.11.28;
Скачать: [xml.tar.bz2];
ВнизОстановка потока Найти похожие ветки
← →
Fr (2010-08-30 18:10) [0]Как правильно остановить поток? Создается при коннекте к 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 18:15) [1]Убрать Sleep, его есть чем заменить.
← →
Fr (2010-08-30 18:17) [2]Или не надо заморачиваться с Terminate, Free, ...:=nil, а поток сам завершит свою работу после того, как проснется в .Execute и освободит все задействованные ресурсы самостоятельно?
← →
Fr (2010-08-30 18:18) [3]
> DVM © (30.08.10 18:15) [1]
Чем?
← →
DVM © (2010-08-30 18:22) [4]
> Fr (30.08.10 18:18) [3]
Да есть разные варианты, от банального цикла включающего в себя проверку Terminated на каждой итерации и Sleep но с гораздо меньшим интервалом или что то в духе CreateWaitableTimer + SetWaitableTimer + WaitForSingleObject
← →
Сергей М. © (2010-08-30 18:23) [5]А какой тайный смысл в этих 30-ти сикундах "спанья" ?
Твоему треду нечем заняться и он решил 30 секунд поспать богатырским сном ?
← →
Fr (2010-08-30 18:30) [6]
> Сергей М. © (30.08.10 18:23) [5]
Да, мне в этом потоке надо выполнить раз в 30с действие и забыть о нем на след. 30с
← →
Fr (2010-08-30 18:32) [7]Я правильно понимаю, что по выходу из процедуры Execute, поток самоуничтожается?
← →
Сергей М. © (2010-08-30 18:33) [8]Ну так на то есть таймеры и таймауты ..
Зачем же намертво усыплять поток ?
← →
Сергей М. © (2010-08-30 18:34) [9]
> Fr (30.08.10 18:32) [7]
Не совсем.
Поток м.б. передан в пул свободных, т.е. ждущих своей очереди на обслуживание очередного установленного соединения.
← →
Fr (2010-08-30 18:36) [10]
> Сергей М. © (30.08.10 18:34) [9]
Тогда как его гарантированно уничтожить?
← →
Fr (2010-08-30 18:39) [11]
> Сергей М. © (30.08.10 18:33) [8]
Попытался реализовать после ответа на http://delphimaster.net/view/2-1281765808/
← →
Сергей М. © (2010-08-30 18:43) [12]
> Fr (30.08.10 18:36) [10]
Если ты о TServerClientThread, то тебя это заботить не должно - тред будет уничтожен самим TServerSocket при его деактивации.
Твое дело - в теле ClientExecute оперативно среагировать на флаг Terminated = True или на ClientSocket.Connected = False, чтобы по факту этих событий закруглить выполнение метода ClientExecute как можно быстрее.
← →
Fr (2010-08-30 19:39) [13]Нет, я создал потомка от 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 он все сделает сам?
← →
DVM © (2010-08-30 20:00) [14]
> Здесь тоже не надо самому заботиться об уничтожении потока?
О потоке заботиться не надо, а вот конкретный экземпляр класса потока надо уничтожать самому.
← →
sniknik © (2010-08-30 20:08) [15]смущают меня "волшебные пузырьки" перед именами компонент... а уж учитывая что в описании класса потока ничего похожего нет сдается, что уничтожение потока это не самая главная твоя проблема.
← →
Fr (2010-08-30 20:15) [16]
> sniknik © (30.08.10 20:08) [15]
"волшебные пузырьки" - это название основной формы, на которой лежит TIdIcmpClient и TClientSocket
А что там за проблемы еще могут быть? Просветите, плиз.
← →
DVM © (2010-08-30 20:26) [17]
> "волшебные пузырьки" - это название основной формы, на которой
> лежит TIdIcmpClient и TClientSocket
Создавай их в рантайм в теле Execute и там же уничтожай. Или сделай полями класса своего TLagThread и создавай в конструкторе, а уничтожай в деструкторе. А то получается что у тебя несколько потоков одновременно имеют доступ к одним и тем же TIdIcmpClient, что чревато
← →
Сергей М. © (2010-08-30 21:30) [18]
> Fr (30.08.10 19:39) [13]
>
> Нет, я создал потомка от TThread:
Ну и за каким чертом ты его создавал, если в справке к компоненту TServerSocket в описании события OnGetThread черным по белому сказано, что создавать (если оно действительно необходимо) следует потомка TServerClientThread и, соответственно, реализовать перекрытый его метод ClientExecute ?
← →
sniknik © (2010-08-30 21:58) [19]вот ведь какие "полезные" пузырьки, весь вечер "проговорили" и оказалось ни о чем... партизанен капут, сдавайся! :)
← →
Сергей М. © (2010-08-30 22:06) [20]Мдя ..
Кругом цветет сплошной цурюк)
← →
Fr (2010-08-30 22:09) [21]
> Сергей М. © (30.08.10 21:30) [18]
> ...если в справке к компоненту TServerSocket в описании события
> OnGetThread...
А я и не говорил про TServerSocket. У меня на форме лежит Client ...
← →
Сергей М. © (2010-08-30 22:16) [22]
> А я и не говорил про TServerSocket
Угу.
Это я придумал.
Цитирую тебя:
> поток.. Создается при коннекте к ServerSocket
Будешь дальше упираться ?)
← →
Fr (2010-08-30 22:31) [23]
> Сергей М. © (30.08.10 22:16) [22]
На мой взгляд, фраза "при коннекте K SeverSocket" означает событие OnConnect на клиенте... До и в приведенных кусках кода видно, что это клиент, а не серверwhile ...ClientSocket.Active
:)
← →
Сергей М. © (2010-08-30 22:33) [24]
> На мой взгляд, фраза "при коннекте K SeverSocket" означает
> событие OnConnect на клиенте
А на мой - ни разу не означает.
ServerSocket упомянут всуе. Ибо ClientSocket"у фиолетово к кому он коннектится.
← →
Сергей М. © (2010-08-30 22:41) [25]
>в приведенных кусках кода видно, что это клиент, а не
> сервер while ...ClientSocket.Active
>
Ни разу не видно.
Фигурирующий в твоем коде ClientSocket вполне можно интерпретировать как свойство объекта класса TServerClientThread.
А то что ты написал Execute, а не ClientExecute, вполне можно отнести к вольному сокращению текста в надежде что тебя поймут.
Вот как ты написал - так тебя и поняли.
Я еще в [9] вел речь о TServerClientThread, а ты только к [21] соизволил уточнить, что , оказывается, TServerSocket тут никаким боком не касается твоей "проблемы")
← →
Fr (2010-08-30 22:53) [26]
> Сергей М. © (30.08.10 22:41) [25]
Ну, значит я опять не точно выразился ....
← →
Anatoly Podgoretsky © (2010-08-31 09:05) [27]Не забывать про Synchronize - данная программа не живая.
← →
Fr (2010-08-31 21:58) [28]
> Anatoly Podgoretsky © (31.08.10 09:05) [27]
> Не забывать про Synchronize - данная программа не живая.
>
В смысле? Synchronize есть - см.:
> Fr (30.08.10 19:39) [13]
← →
Anatoly Podgoretsky © (2010-09-01 11:41) [29]Это ...StatusBar1.Panels[1].Text:="";
трудно назвать Synchronize
← →
Fr (2010-09-02 11:07) [30]Т.е. в секцию
except
end;
надо опять-таки выводить Synchronize и принудительный Terminate?
← →
Сергей М. © (2010-09-02 11:55) [31]
> Fr (02.09.10 11:07) [30]
Правило одно, безотносительно "секций", - обращения в доп.потоке к визуальным VCL-контролам недопустимы.
← →
brother © (2010-09-02 12:00) [32]> обращения в доп.потоке к визуальным VCL-контролам недопустимы
вот такая не справедливость)
← →
Сергей М. © (2010-09-02 12:04) [33]
> вот такая не справедливость
Вопиющая !
К ногтю Борланд и прочие эмбаркадеры !
Скольким выдающимся кодерам они жизнь попортили, у скольких кровушку попили ..
)
← →
Fr (2010-09-02 23:14) [34]
> Сергей М. © (02.09.10 11:55) [31]
спасибо
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.11.28;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c