Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Вниз

Не убиваеться поток !!!   Найти похожие ветки 

 
Vyzcheslav   (2005-06-22 14:05) [0]

Суть токава есть свой класс TTCSThread на основе TThread
вот описание Executу ->

procedure TTCSThread.Execute;
var idx: integer;
begin
 while not Terminated do begin
  if active then
     try
       if not AssignDatamanager then begin
         if CreateDB then begin
           AssignDatamanager;
           SystemLoadFile;
           Authorized;
         end;
       end;
       if DataManager.Connected then begin
         if not IsAuthotized(AirLineCode,CountryCode) then
           Authorized;
         for idx:= 0 to FileList.Count-1 do  begin
           ActiveLoadFile := idx;
           try
             LoadThisFile(FileList.Strings[idx]);
           except
           end;
         end;
         UpdateDatabase;
       end;
     finally
       Terminated := True
     end;
   sleep(10);
 end;
 Active := False;
end;

при  присвоение activу false вызываеться destroy проблема в том что при вызове в конце destroy inherited; дольнейшие отслеживание становиться невозможным, програма переходит в нормальный режим работы т.е.

 rdtLog.Lines.Add("...");
 if Assigned(TCSThread) then
   TCSThread.Free;
 rdtLog.SelAttributes.Style := [];

после строки TCSThread.Free; курсор не попадает на
rdtLog.SelAttributes.Style := []; и при это TCSThread не убивается !!! ошибок никаких не выдаеться ..


 
Vyzcheslav   (2005-06-22 14:06) [1]

В чем проблема Уважаемые матера и подмастерья..


 
Alexander Panov ©   (2005-06-22 14:09) [2]

Приведи код конструктора.


 
kaZaNoVa ©   (2005-06-22 14:10) [3]

имхо поток можно убить TerminateThread() функцией,   Terminated := True малоэффективна


 
Digitman ©   (2005-06-22 14:13) [4]


> В чем проблема


а в чем проблема - взять и установить брейкпойнт в теле Execute() да проследить пошагово, что и при каких условиях там происходит ?


 
Игорь Шевченко ©   (2005-06-22 14:18) [5]

kaZaNoVa ©   (22.06.05 14:10) [3]

Матчасть учить. Потом лезть с ламерскими советами.


 
Vyzcheslav   (2005-06-22 14:20) [6]

>Приведи код конструктора.

constructor TTCSThread.Create;
begin
 inherited Create(False);
 Priority := tpHigher;
end;

>а в чем проблема - взять и установить брейкпойнт в теле Execute() да проследить пошагово, что и при каких условиях там происходит ?

Так вот пошагово смотрю и на  inherited; в destroy типа возрашаюс в прогу !!! а не перехожу на след строку в source code.(смотри начало.


 
Digitman ©   (2005-06-22 14:21) [7]


> kaZaNoVa ©   (22.06.05 14:10) [3]


> Terminated := True малоэффективна


ж. с п. сравнивать - тоже "малоэффективно" : то ж. , а то п. !)


 
alpet ©   (2005-06-22 14:23) [8]

Не убивается вероятно потому, что переменная active никогда не устанавливается в true, и поток только и занимается вызовом Sleep. Наверное с участием событий (TEven) этот код выглядел бы куда лучше.


 
Digitman ©   (2005-06-22 14:23) [9]


> Vyzcheslav   (22.06.05 14:20) [6]


какой нафих inherited ? в твоем Execute() ?
нет там никаких inherited


 
alpet ©   (2005-06-22 14:30) [10]

if Assigned(TCSThread) then TCSThread.Free;

Не хватает проверки того что поток уже завершился (см. метод WaitFor).


 
Vyzcheslav   (2005-06-22 14:31) [11]

>Не убивается вероятно потому, что переменная active никогда не >устанавливается в true, и поток только и занимается вызовом >Sleep. Наверное с участием событий (TEven) этот код выглядел бы >куда лучше.

Active я устанавливаю сам !!! у мне он как property сделан !!!
при изменение active как раз срабатывает (TEvent) по котором в главное форме я делаю TCSThread.Free;

procedure TTCSThread.SetActive(const Value: Boolean);
begin
 FActive := Value;
 if Value then
   Event(1) // Это я переопределяю в главной форме
 else      // TCSThread.Event := TCSEvent;
   Event(2);
end;

procedure TFMain.TCSEvent(const Value: integer);
begin
 case Value of
   1: begin
       rdtLog.SelAttributes.Style := [fsBold];
       rdtLog.Lines.Add("Start load in " + FormatDateTime("dd.mm.yyyy "at" hh:mm:ss",now));
       rdtLog.SelAttributes.Style := [];
     end;
   2:begin
       rdtLog.SelAttributes.Style := [fsBold];
       TCSThread.Free;
       rdtLog.Lines.Add("End load in " + formatDateTime("dd.mm.yyyy "at" hh:mm:ss",now));
       rdtLog.SelAttributes.Style := [];
       if Assigned(TCSThread) then
     end;
 end;
end;
проблема как раз в том что из  TCSThread.Free; я уже не возрашаюсь и сам поток оказываеться не убитым ..

>какой нафих inherited ? в твоем Execute() ?
>нет там никаких inherited

Блин в Destroy !!!!


 
alpet ©   (2005-06-22 14:37) [12]

1. inherited в деструкторе лишнее.
2. Проверку завершения потока все же добавь


 
Vyzcheslav   (2005-06-22 14:40) [13]

Так все понял в чем проблема !!!! Все спасибо ....


 
alpet ©   (2005-06-22 14:40) [14]

Про событие я имел в виду такой код:

procedure TTCSThread.Execute;
var idx: integer;
begin
ActiveEvent.WaitFor (INFINITE);
try
 ...
finally
  Terminated := True
end;
Active := False;
end;

В результате цикл убирается и сам код упрощается. В качестве еще более простой альтернативы можно создавать поток приостановленным и возобновлять его в твоем обработчике SetActive с помощью Resume.


 
kaZaNoVa ©   (2005-06-22 14:49) [15]

Игорь Шевченко ©   (22.06.05 14:18) [5]
почему "ламерский" ?

из справки:

The TerminateThread function terminates a thread.

BOOL TerminateThread(

   HANDLE hThread, // handle to the thread
   DWORD dwExitCode  // exit code for the thread
  );


имхо это самая мощная и надежная функция для завершения нити (Thread)


 
Игорь Шевченко ©   (2005-06-22 15:08) [16]

kaZaNoVa ©   (22.06.05 14:49) [15]


> имхо это самая мощная и надежная функция для завершения
> нити


Самая мощная и надежная функция - это программное нажатие клавиши Reset. Еще более мощная, но уже не программная - это выдергивание сетевого шнура из розетки.

Lamers must die.


 
Digitman ©   (2005-06-22 15:10) [17]


> самая мощная и надежная функция для завершения нити


.. рано или поздно ведущая к проблемам с утечкой ресурсов тех кто, наслушавшись сейчас Казанову, начнет юзать ее бездумно направо и налево


 
kaZaNoVa ©   (2005-06-22 15:27) [18]

Digitman ©   (22.06.05 15:10) [17]
я её не раз юзал и всегда срабатывала ..
правда было иногда нечто-странное, возможно утечки ...


 
Vyzcheslav   (2005-06-22 15:34) [19]

Люди хыы.. самое главное проверка на зовершение потока ..
А я допустил глупую ошибку уничтожал поток из "execute" (по событию на active := False срабатывал event) и получалось что destroy ждал пока поток завершит работу а execute ждал пока завершитя destroy )))))))))


 
alpet ©   (2005-06-22 15:35) [20]

TerminateThread - запасной вариант и должен использоваться в тех случаях когда правильное завершение потока не происходит. С другой стороны если завершение потока не происходит правильно, в программе наверняка есть ошибка. Так-что использовать эту функцию можно в программе для затыкания ошибок, но едва ли для пользы.


 
kaZaNoVa ©   (2005-06-22 15:40) [21]

alpet ©   (22.06.05 15:35) [20]
ага, пользы может и мало будет, но эффет будет - она сработает 100%


 
alpet ©   (2005-06-22 15:46) [22]

kaZaNoVa ©   (22.06.05 15:40) [21]
При определенных условиях может и не сработать. Другое дело что само использование таких "грубых инструментов" в параллельном программировании, черевато многочисленными багами.


 
Digitman ©   (2005-06-22 15:47) [23]


> kaZaNoVa ©   (22.06.05 15:27) [18]
> я её не раз юзал и всегда срабатывала ..
> правда было иногда нечто-странное, возможно утечки


про то тебе и ИШ сказал, насчет LMD.

и не обижайся - на сей момент так и есть.

желаешь разобраться в "иногда нечто-странное, возможно утечки" ?добро пожаловать.

а советы огульные раздавать - уверяю тебя - не следует.

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


 
kaZaNoVa ©   (2005-06-22 15:50) [24]

Digitman ©   (22.06.05 15:47) [23]
ага, прога глючила .. но я забил
чаще всего она работала нормально:))


 
Digitman ©   (2005-06-22 15:51) [25]


> kaZaNoVa ©   (22.06.05 15:50) [24]


малацца максимка.
так держать !


 
Игорь Шевченко ©   (2005-06-22 15:57) [26]

kaZaNoVa ©   (22.06.05 15:50) [24]

<offtopic>
Я тебе искренне желаю скорейшей и удачной сдачи экзаменов, дабы ты мог опять вернуться в timezero
</offtopic>


 
kaZaNoVa ©   (2005-06-22 18:35) [27]

Игорь Шевченко ©   (22.06.05 15:57) [26]
<offtopic>
ок ..  это моё последнее сообщение на этом форуме ..
</offtopic>



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.013 c
6-1114271763
Galiaf
2005-04-23 19:56
2005.08.14
Где лежит компонент "TServerSocket" &amp; "TClientSocket"?


3-1120553844
Gaval
2005-07-05 12:57
2005.08.14
создание базы


1-1122463335
Dust
2005-07-27 15:22
2005.08.14
Глобальные системные флаги


3-1120833608
GEN++
2005-07-08 18:40
2005.08.14
Проблема при открытии


14-1121575392
boriskb
2005-07-17 08:43
2005.08.14
Украинцы, алло!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский