Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.25;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
10-1097579913
ИМХО
2004-10-12 15:18
2005.07.25
Снова о OLE-автоматизации Ворда


14-1119987504
AG.Smit
2005-06-28 23:38
2005.07.25
Bluetooth, SP2 и WIDCOMM


14-1118829505
ANB
2005-06-15 13:58
2005.07.25
Зачем нужен DataSource ?


14-1120467213
alex-drob
2005-07-04 12:53
2005.07.25
Как установить XP из под Dos


14-1120412743
Kerk
2005-07-03 21:45
2005.07.25
By 2012...