Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не убиваеться поток !!! [D7, WinXP]


Страницы:   1 2

Vyzcheslav ©   (2005-06-22 14:05:00) 

Суть токава есть свой класс 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 не убивается !!! ошибок никаких не выдаеться ..


kaZaNoVa   (2005-06-22 18:35:00) [1]

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


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

kaZaNoVa ©   (22.06.05 15:50) [24]

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


Digitman   (2005-06-22 15:51:00) [3]


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


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


kaZaNoVa   (2005-06-22 15:50:00) [4]

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


Digitman   (2005-06-22 15:47:00) [5]


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


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

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

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

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

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


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

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


kaZaNoVa   (2005-06-22 15:40:00) [7]

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


alpet   (2005-06-22 15:35:00) [8]

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


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

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


kaZaNoVa   (2005-06-22 15:27:00) [10]

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


Digitman   (2005-06-22 15:10:00) [11]


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


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


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

kaZaNoVa ©   (22.06.05 14:49) [15]


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


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

Lamers must die.


kaZaNoVa   (2005-06-22 14:49:00) [13]

Игорь Шевченко ©   (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)


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

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

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

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


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

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


alpet   (2005-06-22 14:37:00) [16]

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


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

>Не убивается вероятно потому, что переменная 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:30:00) [18]

if Assigned(TCSThread) then TCSThread.Free;

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


Digitman   (2005-06-22 14:23:00) [19]


> Vyzcheslav   (22.06.05 14:20) [6]


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


alpet   (2005-06-22 14:23:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо