Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-84109
Hog
2003-06-10 16:14
2003.06.26
String индексы и VAR параметр


14-84698
Vlad Oshin
2003-06-05 11:15
2003.06.26
А помните? ..И ему было только 16 лет!?!


3-84043
Z_man7777
2003-06-02 06:25
2003.06.26
Вопрос по полю типа Float в InterBase6.x


1-84410
Yoyo
2003-06-09 18:03
2003.06.26
Нужно вставить текст


1-84161
Aleksandr
2003-06-11 15:29
2003.06.26
Что надо сделать для





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский