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

Вниз

Объясните мне, в чем проблема уничтожения терминированной нити?!   Найти похожие ветки 

 
Aleksandr.   (2005-10-13 14:39) [0]

Ну никак мне не понять. Ставлю потомку нити в констракторе FreeOnTerminate=false; в Execute цикл repeat...until Terminated,
назначаю ему OnTerminate метод, внутри которого будет вызван метод главной формы, уничтожающий нить.
Все зашибись до того самого момента, как метод главной формы вызовет FreeAndNil(FSesThread) - на этом безо всяких except программа займется бесконечным онанизмом. Проблема, как я понимаю, в том, что терминированный поток надо снова запустить для того, чтобы он уничтожился, ну так он ведь при этом опять уйдет в Execute и снова вызовет OnTerminate, маразм получится?!
Можно было, как вариант, сделать FreeOnTerminate:=true, но мне с этой нити после ее терминирования надо истчо считать ряд свойств.


 
Digitman ©   (2005-10-13 14:41) [1]


> назначаю ему OnTerminate метод, внутри которого будет вызван
> метод главной формы, уничтожающий нить


это кто тебя так научил ?)


 
Eraser ©   (2005-10-13 14:43) [2]


> Aleksandr.   (13.10.05 14:39)

> Можно было, как вариант, сделать FreeOnTerminate:=true,
> но мне с этой нити после ее терминирования надо истчо считать
> ряд свойств.

Кто мешает это сделать, например, через Synchronize в OnExecute?

> назначаю ему OnTerminate метод, внутри которого будет вызван
> метод главной формы, уничтожающий нить.

А нельзя сразу из OnTerminate освободить объект потока?


 
Alexander Panov ©   (2005-10-13 14:57) [3]

 TMyClass=class
   class procedure OnTerminate(Sender: TObject);
 end;

 TMyThread=class(TThread)
 protected
   procedure Execute; override;
 public
   FField: String;
   constructor Create;
 end;

{ TMyThread }

constructor TMyThread.Create;
begin
 inherited Create(True);
 FreeOnTerminate := False;
 FField := "11111111111";
end;

procedure TMyThread.Execute;
begin
 FField := "2222222";
end;

{ TMyClass }

class procedure TMyClass.OnTerminate(Sender: TObject);
begin
 ShowMessage(TMyThread(Sender).FField);
 TMyThread(Sender).Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin

 with TMyThread.Create do
 begin
   OnTerminate := TMyClass.OnTerminate;
   Resume;
 end;

end;


 
Leonid Troyanovsky ©   (2005-10-13 17:27) [4]


> Aleksandr.   (13.10.05 14:39)  

> Можно было, как вариант, сделать FreeOnTerminate:=true,
> но мне с этой нити после ее терминирования надо истчо считать
> ряд свойств.


Этому ничто не препятствует.
OnTerminate может быть назначен хоть метод формы (т.к. исполняться он
будет VCL потоком). Там и можно считать все нужные данные, а после
выхода из метода объект TXThread будет разрушен (автоматически).

Ну, а установка FreeOnTerminate := False подразумевает, что в коде
первичного потока есть ожидание некоего сигнала, например,
завершение потока, событие и т.д. по которому первичный поток
сделает созданному  Free.
В том же OnTerminate можно (безопасно) прочитать нужные свойства
почившего потока.

--
Regards, LVT.


 
Aleksandr.   (2005-10-13 17:58) [5]

Всем спасибо, не очень понял ответа на вопрос, зато наглядно увидел другие реализации.


 
Leonid Troyanovsky ©   (2005-10-13 18:23) [6]


> Aleksandr.   (13.10.05 17:58) [5]
> Всем спасибо, не очень понял ответа на вопрос,


Если опустить все связанное с потоком, то вопрос звучит так
"почему нельзя уничтожить объект в его методе (или обработчике)".
Думаю, что он настолько тривиален, что никто не решился обсасывать
эту тему в данной конференции.
Ну, а сделать такое, тем не менее, можно, см. например TForm.Release.

А применительно к потокам в этом нет нужды, т.к. надо различать всего
два случая [FreeOnTerminate]:

1. Первичному потоку хорошо известно, когда следует вызвать Free
для уничтожения порожденного потока, и он его вызывает сам.

2. Первичный поток действует в духе "выстрелил и забыл",  давая шанс
вторичному потоку отработать самостоятельно,
хотя, возможно, он рассчитывает на наследство, которое, при желании,
получит в OnTerminate.

--
Regards, LVT.


 
Aleksandr.   (2005-10-13 19:43) [7]

Leonid Troyanovsky © :
>
> Если опустить все связанное с потоком, то вопрос звучит
> так
> "почему нельзя уничтожить объект в его методе (или обработчике)".
>


Вот теперь понятен и смысл происходящей вилки, спасибо. Как всегда, за лесом деревьев не видно...



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

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

Наверх




Память: 0.49 MB
Время: 0.041 c
14-1129618430
vuk
2005-10-18 10:53
2005.11.06
Тут эта... Tony Levin Band в Москву приезжает...


1-1129186838
REA
2005-10-13 11:00
2005.11.06
TTF Editor


14-1129586099
beglec
2005-10-18 01:54
2005.11.06
www.delphimaster.ru - лучший способ поднять настроение.


14-1129398841
Praetor
2005-10-15 21:54
2005.11.06
Человек чмо? или нет?


14-1129193739
Kolan
2005-10-13 12:55
2005.11.06
Объясните разницу между SDK и Драйвером.