Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 тоже

и заработало
закоментировал строчки и опять не работает

И схожу сума


Наверх

Титульная страница Поиск, карта сайта Написать письмо