![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не убиваеться поток !!! [D7, WinXP]
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) этот код выглядел бы куда лучше.