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

Вниз

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

 
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 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.046 c
1-1122496763
muny
2005-07-28 00:39
2005.08.14
функция power


6-1115226291
olevacho_
2005-05-04 21:04
2005.08.14
журнал посещений страниц на Делфи


14-1122018175
Fin
2005-07-22 11:42
2005.08.14
Что делать или как поступить?


4-1119508902
Grief
2005-06-23 10:41
2005.08.14
Окошко из трея (не знаю как назвать)


3-1120723703
cvg
2005-07-07 12:08
2005.08.14
Подскажите новичку -- связь Delphi и MySQL