Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1129094952
SANEK_10289
2005-10-12 09:29
2005.11.06
Помогите пожалуйста... Я из реестра беру имя пользователя...


5-1089284149
Tormoz
2004-07-08 14:55
2005.11.06
Не сохраняется свойство компонента


3-1127296298
yk
2005-09-21 13:51
2005.11.06
Как сохранить запрос и сделать union с другим запросом


1-1129137427
Rianon
2005-10-12 21:17
2005.11.06
Проблема с Dll и формами


5-1107495689
Артем К.
2005-02-04 08:41
2005.11.06
Как создать компонент, состоящий из нескольких компонет?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский