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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
1-18463
First_May
2003-09-24 13:21
2003.10.06
EnumResourceNames...


14-18543
andre
2003-09-16 22:38
2003.10.06
Ламерский вопрос


3-18221
yuray76
2003-09-15 17:08
2003.10.06
Количество коннектов к базе Interbase...


1-18461
AAZ69
2003-09-24 14:22
2003.10.06
Динамическое обращение к компонентам


4-18666
Yurique
2003-07-31 14:41
2003.10.06
Является ли окно главным