Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
14-8113
AlekseyK
2002-09-07 12:39
2002.10.03
Помогите раскодировать


3-7771
AM
2002-09-11 12:15
2002.10.03
Выполнение хран. процедуры идет как одна транзакция?


1-7911
Metotrone
2002-09-23 16:40
2002.10.03
Положение курсора в Memo1


3-7779
woland
2002-09-14 23:35
2002.10.03
Как в QuickReport вывести надписть вертикально?


1-7955
Лана Розанова
2002-09-23 16:38
2002.10.03
Использование модулей





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский