Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.009 c
3-89701
Softal
2003-11-10 15:20
2003.11.27
MySQL и delphi


8-90009
GILforever
2003-08-02 02:26
2003.11.27
Многообъектная печатаемая поверхность


14-90096
K.o.Z
2003-11-04 01:53
2003.11.27
HTML


3-89685
St@syan
2003-11-06 11:55
2003.11.27
Как сделать


1-89869
Ламер
2003-11-16 01:56
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский