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

Вниз

Ожидание окончания потока.   Найти похожие ветки 

 
Manfred   (2003-11-11 14:06) [0]

Уважаемые Мастера, подскажите, пожалуйста, как отследить завершение потока?
С уважением, Manfred.


 
Yakudza   (2003-11-11 14:17) [1]

WaitFor


 
TUser   (2003-11-11 14:46) [2]

Подождать завершения - [1], проверить завершен ли - Terminated. Про работу с WiatFor - см здесь
http://delphimaster.net/view/1-1068421119/


 
Manfred   (2003-11-11 15:25) [3]

Мне бы получить уведомление об окончании потока.


 
TUser   (2003-11-11 15:38) [4]

OnTerminate?


 
Manfred   (2003-11-11 15:47) [5]


> TUser
Не работает :-(


 
panov   (2003-11-11 16:08) [6]

Прекрасно работает. Вот пример:

Основная форма:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
public
procedure MyProc(Sender: TObject);
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.MyProc(Sender: TObject);
begin
ShowMessage("End Thread");
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with Ttest.Create(True) do
begin
OnTerminate := MyProc;
Resume;
end;
end;

end.


Модуль с определением класса-потока:

unit Unit2;

interface

uses
Classes,windows;

type
TTest = class(TThread)
protected
procedure Execute; override;
end;

implementation

procedure TTest.Execute;
begin
Sleep(3000);
end;

end.


 
Digitman   (2003-11-11 17:10) [7]


> Manfred


> Мне бы получить уведомление об окончании потока.


перехватывай ф-цию ExitThread()
иных "уведомлений" нет

обработчик же OnTerminate() выполняется еще в момент работы доп.потока


 
Manfred   (2003-11-11 17:12) [8]

Спасибо, Мастера, заработало :-)


 
Manfred   (2003-11-17 02:31) [9]

А вот ещё решение.
Получаем handle запущенного нами потока и ожидаем его изменения:

var
popa: Cardinal;
MyThread: TThread;
begin
MyThread := TThread.Create(по фигу False или True);
popa := MyThread.Handle;
while (MyThread.Handle = popa) do Application.HandleMessages;
end;

Это принцип, реализация может быть любой.
Кстати, работает безукоризненно.

С уважением, Manfred.


 
Digitman   (2003-11-17 09:06) [10]


> Кстати, работает безукоризненно


не верю.

не знаю как в Д7, но в Д5 класс TThread при завершении потока не изменяет никоим образом поле Handle, и цикл

while (MyThread.Handle = popa) do

будет бесконечным

к тому же, если св-во FreeOnTerminate = True, то риск схлопотать AV на любой из строчек

popa := MyThread.Handle; //здесь
while (MyThread.Handle = popa) do ... //или здесь

очень велик


 
Семен Сорокин   (2003-11-17 09:27) [11]

2Manfred
Как вариант - посылать сообщение окну о завершении потока.



Страницы: 1 вся ветка

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

Наверх




Память: 0.46 MB
Время: 0.01 c
3-89708
ZHK
2003-11-06 09:40
2003.11.27
Paradox 4.5


1-89827
md
2003-11-10 13:21
2003.11.27
Получение параметров


9-89664
Riko
2003-05-20 14:27
2003.11.27
Как загрузить карту?


4-90180
Ancara
2003-10-05 15:57
2003.11.27
GetMousePos


1-89979
Vitaliygavrilov
2003-11-17 15:22
2003.11.27
Как загрузить другую программу из своей





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