Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
ВнизTThread Найти похожие ветки
← →
Dmitrij_K (2005-07-06 16:18) [0]Не работает событие OnTerminate
программа без формы, так что я создал класс
TThreadTerminateClass=class
procedure ThreadTerminate(Sender: TObject);
end;
var ttc: TThreadTerminateClass;
...
begin
...
Thread1.OnTerminate := ttc.ThreadTerminate;
...
Thread1.Teminate;
а ThreadTerminate не срабатывет.
← →
Dmitrij_K (2005-07-06 16:24) [1]Это еще интереснец чем я думал
в конце execute поставил showmessage и в ThreadTerminate тоже
и заработало
закоментировал строчки и опять не работает
И схожу сума
← →
Digitman © (2005-07-06 16:31) [2]
> в конце execute поставил showmessage
нельзя этого делать
showmessage() неявно создает форму, форма - это визуальный VCL-объект, обращение к таким объектам в контексте неосновного трэда недопустимо
← →
Dmitrij_K (2005-07-06 16:37) [3]ну вопрос в другом . Почему onterminate не срабатывает?
← →
Юрий Зотов © (2005-07-06 16:46) [4]Похоже, что поток просто не завершается, вот оно и не срабатывает. Код создания и код Execute желательно бы...
← →
Digitman © (2005-07-06 16:47) [5]а почему он должен отрабатывать ?
ведь вызов обработчика этого события должен произойти в контексте осн.трэда, когда в нем будет вызван CheckSynchronize()
ты где-то явно или неявно вызываешь эту ф-цию ?
нет, не вызываешь.
ну так а что же тогда ты хочешь ?)
← →
Dmitrij_K (2005-07-06 16:49) [6]
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;
← →
Dmitrij_K (2005-07-06 16:51) [7]То есть надо просто вызвать CheckSynchronize в каком-нибудь месте?
← →
Digitman © (2005-07-06 16:52) [8]
> // сюда точно доходит
случайность .. может и не дойти, если Thread1.Resume - последний оператор программы
← →
Digitman © (2005-07-06 16:58) [9]
> Dmitrij_K (06.07.05 16:51) [7]
> То есть надо просто вызвать CheckSynchronize в каком-нибудь
> месте?
не в каком-нибудь, а строго в том, где ты ожидаешь потенциальное возникновение события OnTerminate
и не один раз, а циклически, пока не свершится факт обработки этого события
← →
Digitman © (2005-07-06 17:03) [10]
> программа без формы
это же не мешает использовать объект Application
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.012 c