Текущий архив: 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.52 MB
Время: 0.011 c