Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизОбъясните мне, в чем проблема уничтожения терминированной нити?! Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c