Главная страница
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.49 MB
Время: 0.016 c
3-89786
Митяй
2003-11-06 16:42
2003.11.27
DB Трей


14-90053
tytus
2003-11-06 10:49
2003.11.27
WindowsXP SP2


14-90089
flip
2003-11-04 18:43
2003.11.27
Srochno


14-90103
PavelSin
2003-11-04 10:40
2003.11.27
Просмоторщик дайджестов


3-89789
KIR
2003-11-06 17:38
2003.11.27
Народ, требуется ли BDE, если используется DB.pas?