Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизНеопределенность при вызове метода 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.029 c