Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.28;
Скачать: CL | DM;

Вниз

Остановка потока   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.014 c
2-1283518156
NoSilence
2010-09-03 16:49
2010.11.28
Всегда поверх остальных


2-1283683267
Hapastiks
2010-09-05 14:41
2010.11.28
заголовок сообщения


6-1229960991
Zlodeyz
2008-12-22 18:49
2010.11.28
Помогите создать Dial Up соединение


2-1283843667
Илья К.
2010-09-07 11:14
2010.11.28
AV при использовании IBUpdateSQLW


11-1226407265
Dy1
2008-11-11 15:41
2010.11.28
исчез RichEdit