Главная страница
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.036 c
2-1128951923
Gomez
2005-10-10 17:45
2005.11.06
Удаление рисунка


9-1119397693
!Trinix
2005-06-22 03:48
2005.11.06
Работа в закрытых помещениях.


2-1129390093
rainface
2005-10-15 19:28
2005.11.06
TADOtalble,DBgrig


1-1129723022
apellido
2005-10-19 15:57
2005.11.06
Как ограничить кол-во символов в TEdit для пропорц. шрифтов


9-1112703539
qwe
2005-04-05 16:18
2005.11.06
Glscene скорость работы приложения