Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1284117218
Avil
2010-09-10 15:13
2010.11.28
Изменение позиции формы одной командой


15-1282342827
Rouse_
2010-08-21 02:20
2010.11.28
Ega23 - это залет номер два :)


2-1283831226
03111978
2010-09-07 07:47
2010.11.28
все значения со знаком минус....


2-1283144728
azamatufa
2010-08-30 09:05
2010.11.28
использование uses


15-1281644994
Юрий
2010-08-13 00:29
2010.11.28
С днем рождения ! 13 августа 2010 пятница





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский