Форум: "WinAPI";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
ВнизЗавершился ли Thread или нет? Найти похожие ветки
← →
Soft (2002-08-16 14:04) [0]Здравствуйте мастера.
Вот возник вопрос, как можно узнать завершился ли выполненный Thread или весь код его еще не выполнен. Потому, что когда ставится FreeOnTerminate=True он затирается сам, но узнать об этом невозможно.
← →
Ученик (2002-08-16 14:07) [1]TThread.OnTerminate
← →
Digitman (2002-08-16 15:44) [2]>Ученик
OnTerminate() не подойдет по условиям. В момент обработки поток еще "жив". Как "жив" он еще и некоторое (пусть даже и очень малое) время после завершения обработчика.
>Soft
Самый надежный способ - вызов любой из удобных тебе API-ф-ций ожидания, параметром в которую необходимо передать хэндл Thread"а.
Можно и методом WaitFor воспользоваться, но это - менее надежно в некоторых случаях.
← →
Ученик (2002-08-16 15:56) [3]>Digitman © (16.08.02 15:44)
{ classes.pas, Delphi 5.0}
function ThreadProc(Thread: TThread): Integer;
var
FreeThread: Boolean;
begin
try
Thread.Execute;
finally
FreeThread := Thread.FFreeOnTerminate;
Result := Thread.FReturnValue;
Thread.FFinished := True;
Thread.DoTerminate;
if FreeThread then Thread.Free;
EndThread(Result);
end;
end;
Execute - уже выполнен, подходит под условие задачи.
← →
Digitman (2002-08-16 16:11) [4]>Ученик
Не подходит.
"завершился ли .. весь код " <> "завершилось выполнение Execute()"
еще раз взгляни на процитированный тобой же код :
то, что в блоке finally, продолжает выполняться в контексте еще работающего потока, вплоть до EndThread. В т.ч. и вызов метода DoTerminate(), в теле которого происходит синхронный вызов события OnTerminate()
← →
Ученик (2002-08-16 16:17) [5]>Digitman © (16.08.02 16:11)
Автор вопроса нас рассудит :)))
← →
SaS13 (2002-08-16 16:30) [6]А можно так:
const
WM_THREAD_DONE_MSG = WM_USER + 1;
// В форме объявить обработчик
procedure ThreadDone( var AMessage : TMessage ); message WM_THREAD_DONE_MSG;
..
и переписать деструктор Thread"а
destructor TMyThread.Destroy;
begin
PostMessage( fmMain.Handle, WM_THREAD_DONE_MSG, self.ThreadID, 0 );
inherited Destroy
end;
← →
Digitman (2002-08-16 16:30) [7]>Ученик
Заодно и вопрос научится ставить)...
Чтобы мы здесь с тобой флейм не разводили. :|
← →
Soft (2002-08-16 21:01) [8]Все класно, работает, спасибо.
type
Mythread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
destructor Destroy;override;
end;
implementation
destructor Mythread.Destroy;
begin
Form1.Label5.Caption:="do destroy";
end;
Большого и безглючного кода всем.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c