Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];

Вниз

OnTreminate := SomeObj.SomeProc вместе с FreeOnTerminate := true;   Найти похожие ветки 

 
w666w   (2003-09-25 17:25) [0]

Имеет ли смысл и правильно ли использование такого подхода? Потому как я немогу вызвать деструктор потока в SomeObj.SomeProc, но это необходимо....


 
Юрий Зотов   (2003-09-25 17:35) [1]

Смысл имеет. После завершения Execute выполняется SomeProc, затем поток автоуничтожается. Нормальная схема, я часто ее использую.

> Потому как я немогу вызвать деструктор потока в
> SomeObj.SomeProc
Естественно, при такой схеме не можете. И не нужно этого делать.

> но это необходимо....
Почему? Не верится...


 
w666w   (2003-09-25 17:41) [2]

потому как поток для своих нужд создает множество объектов, которые необходимо уничтожать по завершении этого потока. А предоставлять ко всем этим объектам доступ при помощи свойств и удалять их непосредственно в SomeObj.SomeProc (через эти самые свойства) совсем неохота - да и некрасиво.


 
MBo   (2003-09-25 17:45) [3]

так зачем удалять объекты в SomeObj.SomeProc, если этим займется деструктор потока???


 
w666w   (2003-09-25 17:47) [4]

И вопрос в догонку:
Допустим, дочерние потоки создаются одним потоком - мастером (но не главным потоком приложения). Есть ли разница в присваивании

OnTreminate := MasterThread.SlaveThreadDone
и
OnTreminate := MainForm.SlaveThreadDone (главный поток приложения)

???

Ведь в хелпе написано, что любые вызовы OnTerminate дочерних потоков будут в любом случае выполняться в контексте главного потока...


 
w666w   (2003-09-25 17:48) [5]

MBo [3]
Это был ответ на Юрий Зотов [1]
>> но это необходимо....
>Почему? Не верится...


 
Юрий Зотов   (2003-09-25 17:59) [6]

> w666w

> потому как поток для своих нужд создает множество объектов,
> которые необходимо уничтожать по завершении этого потока.

Надеюсь, в деструкторе потока их уничтожение прописано? И все, забудьте о них. При FreeOnTerminate=True деструктор будет вызван автоматически, после выхода из SomeProc. Вот он все и уничтожит.

> любые вызовы OnTerminate дочерних потоков будут в любом случае
> выполняться в контексте главного потока...

У Дельфишного класса TThread вообще все выполняется в главном потоке. Кроме единственного метода Execute, который выполняется в собственном отдельном потоке. Отсюда и стройте схему.


 
w666w   (2003-09-25 18:08) [7]

Однако в ветке http://delphimaster.net/view/1-1063973667/ обсуждаласся вопрос того, что метод Create потока выполняется в контексте того потока, который его вызвал (это не всегда главный поток программы). Разве это не так?


 
Юрий Зотов   (2003-09-25 18:24) [8]

w666w (25.09.03 18:08) [7]

Так, конечно. Не надо же понимать все дословно.
:о)

Но вот если посмотреть конкретную реализацию события OnTerminate, то увидим:

function ThreadProc(Thread: TThread): Integer;
...
begin
...
try
if not Thread.Terminated then
try
Thread.Execute;
except
Thread.FFatalException := AcquireExceptionObject;
end;
finally
FreeThread := Thread.FFreeOnTerminate; // Запомнили
...
Thread.DoTerminate; // Вызвали
...
if FreeThread then Thread.Free; // Уничтожили

...
end;

procedure TThread.DoTerminate;
begin
if Assigned(FOnTerminate) then Synchronize (CallOnTerminate);
end;

procedure TThread.CallOnTerminate;
begin
if Assigned(FOnTerminate) then FOnTerminate(Self);
end;

Вот этот Synchronize все и решает. Насколько я в курсе, его реализация в различных версиях Delphi тоже разная - и поэтому CallOnTerminate может выполняться либо в главном, либо в СОЗДАВШЕМ потоке.



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

Форум: "Основная";
Текущий архив: 2003.10.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
1-18294
Vt
2003-09-24 07:16
2003.10.06
Мастера почему не работает процедура Close. На onShow


1-18435
Murad
2003-09-23 12:28
2003.10.06
Ole объект


14-18581
lak
2003-09-17 22:44
2003.10.06
file name в графике


3-18244
k_len
2003-09-16 11:36
2003.10.06
Отчеты


4-18681
D ick
2003-07-31 14:09
2003.10.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский