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

Вниз

Неопределенность при вызове метода TThread.Terminate   Найти похожие ветки 

 
fs_more   (2003-06-09 13:36) [0]

Ситуация: Некие вычисления выполняются в отдельном потоке. Класс потока имеет дополнительные поля.
По окончании (метод Execute завершает работу) экземпляр потока должен уничтожаться (свойство FreeOnTerminate установлено в "true"), но остается виден в главном потоке приложения! Поля по прежнему содержат установленные значения а переменная MyThread:TThread1 имеет значение отличное от nil.
Попытка вызова метода Free приводит к ошибке по адресу 00000009 и краху программы.
Подскажите, кто сталкивался, в чем может быть проблема?


 
DmS   (2003-06-09 13:39) [1]

> переменная MyThread:TThread1 имеет значение отличное от nil

из этого не следует, что поток не уничтожен


 
Palladin ©   (2003-06-09 13:41) [2]

а почему она должна быть nil?


 
fs_more   (2003-06-09 13:43) [3]

Можно ли использовать освобожденную таким образом переменную повторно?


 
Skier ©   (2003-06-09 13:46) [4]

OnTerminate
begin
//.................
MyThread := nil;
//.................
end;
?


 
DmS   (2003-06-09 13:47) [5]

почему нет


 
VMcL ©   (2003-06-09 13:47) [6]

>fs_more (09.06.03 13:43)

Да.


 
Digitman ©   (2003-06-09 13:48) [7]


> экземпляр потока должен уничтожаться (свойство FreeOnTerminate
> установлено в "true"),


Все верно. Он и уничтожется.


> Поля по прежнему содержат установленные значения


Ну и что ? Вполне объяснимое явление) ... А ты что ожидал увидеть ?


> остается виден в главном потоке приложения


что значит "виден" ? и при чем здесь "главный поток" ? мало ли какой код.поток создал экз-р TThread !
вовсе и не обязательно, что главный...



 
fs_more   (2003-06-09 13:48) [8]

Каким образом прицепить (описать) OnTerminate, чтоб оно выполнялось по окончании потока?


 
Skier ©   (2003-06-09 13:50) [9]

>fs_more (09.06.03 13:48)
OnTerminate := OnTerminateEvent;


 
fs_more   (2003-06-09 13:54) [10]

> Skier © (09.06.03 13:50)
OnTerminate - свойство TThread. Вопрос в том в какой процедуре должен выполняться код "MyThread := nil;" и как эту процедуру вызвать по событию OnTerminateEvent?


 
Palladin ©   (2003-06-09 13:59) [11]

тебе это принципиально?


 
Skier ©   (2003-06-09 14:00) [12]

Ты должен задать реакцию на событие OnTerminate (присвоить обработчик), это можно сделать после вызова контсруктора TThrea.Create( True)
И в этом обработчике пишешь MyThread := nil


 
fs_more   (2003-06-09 14:05) [13]

Этот самый обработчик, это идентификатор процедуры-етода класса TThread? Т.е. писать MyThread.OnTerminate:=MyThread.SomeFunction; Так?
Дело в том, что в текущем варианте после повторного создания потока на ту же переменную (повторный вызов MyThread:=TThread1.Create(...)) - это после завершения и якобы уничтожения объекта! - он не работает корректно - сплошные ошибки и зависания.


 
Digitman ©   (2003-06-09 14:05) [14]


> fs_more (09.06.03 13:48)
> Каким образом прицепить (описать) OnTerminate, чтоб оно
> выполнялось по окончании потока?


никаким.

OnTerminate вызывается в контексте код.потока, создавшего 1-й экземпляр объекта TThread, и вызывается еще ДО завершения данного код.потока, который тем самым (возбуждением этого события) извещает заинтересованный код о ПРЕДСТОЯЩЕМ своем терминировании.


 
fs_more   (2003-06-09 15:22) [15]

Дело в том, что в текущем варианте после повторного создания потока на ту же переменную (повторный вызов MyThread:=TThread1.Create(...)) - это после завершения и якобы уничтожения объекта! - он не работает корректно - сплошные ошибки и зависания.


 
panov ©   (2003-06-09 16:05) [16]

Ну если бы ты еще и код свой привел...


 
Digitman ©   (2003-06-09 16:22) [17]


> fs_more


я так понимаю, понятия об отладке приложения (в 1-ю очередь и хотя бы - средствами встроенного в DelphiIDE отладчика) ты не имеешь никакого ?


 
Chlavik ©   (2003-06-09 18:04) [18]

Может FreeAndNil..


 
kull ©   (2003-06-09 18:28) [19]


> Digitman © (09.06.03 14:05)
>
> ... который тем самым (возбуждением этого
> события) извещает заинтересованный код о ПРЕДСТОЯЩЕМ своем
> терминировании.

Ответ неверный!
Заинтересованный код, я так понимаю - это код в методе TThread.Execute.
А событие OnTerminate вызывается после Execute.


 
kull ©   (2003-06-09 18:32) [20]

Ведь заинтересованный код не должно ИНТЕРЕСОВАТЬ то что происходит после метода Execute.


 
fs_more   (2003-06-10 13:15) [21]

Код следующий:

var
OutMan :TOutMan1; //класс-потомок TThread

procedure TForm1.Button1Click(Sender: TObject);
begin
if {(OutMan = nil)} not Assigned(OutMan) then OutMan := TOutMan1.Create(true);
OutMan.FreeOnTerminate := true;
OutMan.Resume;
end; //это кнопка запуска процесса из главной формы

procedure TForm1.Button2Click(Sender: TObject);
begin
OutMan.Terminate;
end; //а это кнопка его остановки

Так вот, при попытке повторного запуска после такой остановки, запуска не происходит, даже если вызывать конструктор без предварительной проверки OutMan = nil.

Потому и возникает вопрос, может объект еще не удален?!


 
Digitman ©   (2003-06-10 13:28) [22]


> kull © (09.06.03 18:28)


цитирую :


> fs_more (09.06.03 13:48)
> Каким образом прицепить (описать) OnTerminate, чтоб оно
> выполнялось по окончании потока?


и что же в моем ответе "неверно" ? разве тело метод Execute и "поточная функция" есть одно и то же ?
каков вопрос - таков и ответ)


 
panov ©   (2003-06-10 13:48) [23]

procedure TForm1.Button2Click(Sender: TObject);
begin
OutMan.Terminate;
OutMan := nil;
end; //а это кнопка его остановки

А где же код твоего потока?

Сколько гадать можно?



Страницы: 1 вся ветка

Текущий архив: 2003.06.26;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
1-84095
megadeth
2003-06-10 10:42
2003.06.26
TMainMenu -> SaveToFile(...) ?


14-84727
nick-from
2003-06-05 14:17
2003.06.26
DBF


14-84554
Leon_M@ni@k
2003-06-07 17:57
2003.06.26
СРОЧНО СРОЧНО - считанные Часы остались - помогите с отбором инфы


14-84735
Дремучий
2003-06-05 18:54
2003.06.26
Кто из форумцев пользуется клиентом форума? Каким?


1-84439
Alexandr
2003-06-10 07:06
2003.06.26
компилятор