![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TThread [D7, WinXP]
Dmitrij_K © (2005-07-06 16:18:00)Не работает событие OnTerminate
программа без формы, так что я создал класс
TThreadTerminateClass=class
procedure ThreadTerminate(Sender: TObject);
end;
var ttc: TThreadTerminateClass;
...
begin
...
Thread1.OnTerminate := ttc.ThreadTerminate;
...
Thread1.Teminate;
а ThreadTerminate не срабатывет.
Digitman (2005-07-06 17:03:00) [1]
> программа без формы
это же не мешает использовать объект Application
Digitman (2005-07-06 16:58:00) [2]
> Dmitrij_K (06.07.05 16:51) [7]
> То есть надо просто вызвать CheckSynchronize в каком-нибудь
> месте?
не в каком-нибудь, а строго в том, где ты ожидаешь потенциальное возникновение события OnTerminate
и не один раз, а циклически, пока не свершится факт обработки этого события
Digitman (2005-07-06 16:52:00) [3]
> // сюда точно доходит
случайность .. может и не дойти, если Thread1.Resume - последний оператор программы
Dmitrij_K (2005-07-06 16:51:00) [4]То есть надо просто вызвать CheckSynchronize в каком-нибудь месте?
Dmitrij_K (2005-07-06 16:49:00) [5]
procedure TRARThread.Execute;
begin
while not Terminated do begin
end;
// showmessage('AAAAA');
// сюда точно доходит
end;
constructor TRARThread.Create;
begin
inherited Create(True);
FRetKod := 0;
FMakeCount := 0;
FErrorCount := 0;
FWaitCount := 0;
FBlackList := TStringList.Create;
FreeOnTerminate := True;
if not ReadINI then FRetKod := 1;
end;
...
Thread1 := TRARThread.Create;
Thread1.OnTerminate := ttc.ThreadTerminate;
if Thread1.RetKod<>0 then Thread1.Terminate
else TStatus := 0;
Thread1.Resume;
Digitman (2005-07-06 16:47:00) [6]а почему он должен отрабатывать ?
ведь вызов обработчика этого события должен произойти в контексте осн.трэда, когда в нем будет вызван CheckSynchronize()
ты где-то явно или неявно вызываешь эту ф-цию ?
нет, не вызываешь.
ну так а что же тогда ты хочешь ?)
Юрий Зотов (2005-07-06 16:46:00) [7]Похоже, что поток просто не завершается, вот оно и не срабатывает. Код создания и код Execute желательно бы...
Dmitrij_K (2005-07-06 16:37:00) [8]ну вопрос в другом . Почему onterminate не срабатывает?
Digitman (2005-07-06 16:31:00) [9]
> в конце execute поставил showmessage
нельзя этого делать
showmessage() неявно создает форму, форма - это визуальный VCL-объект, обращение к таким объектам в контексте неосновного трэда недопустимо
Dmitrij_K (2005-07-06 16:24:00) [10]Это еще интереснец чем я думал
в конце execute поставил showmessage и в ThreadTerminate тоже
и заработало
закоментировал строчки и опять не работает
И схожу сума