Форум: "Основная";
Текущий архив: 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