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

Вниз

Завершился ли 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 вся ветка

Текущий архив: 2002.10.03;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
1-7950
liho26
2002-09-24 07:40
2002.10.03
Смысл оптимизации...


3-7842
Nikolai_S
2002-09-12 15:54
2002.10.03
Общий доступ к БД


3-7828
Andrew_
2002-09-11 19:27
2002.10.03
Координаты ячейки в DBGrid, над которой находится мышь


14-8161
Undert
2002-09-09 00:13
2002.10.03
Для Питербуржцев охрененное предложение!!!


14-8177
Сергей Суровцев
2002-09-06 20:14
2002.10.03
Народ, американский флаг никто не брал?