Главная страница
    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.008 c
3-89680
Petrovick
2003-11-06 14:48
2003.11.27
Где можно скачать статью или пример работы с АДО


14-90091
vuk
2003-11-04 14:04
2003.11.27
Получите! Распишитесь!


1-89974
афвуд
2003-11-17 15:10
2003.11.27
Почему StretchDraw не работает?


1-89872
Checist [root]
2003-11-15 02:17
2003.11.27
НЕПОНЯТНЫЙ БАГ !!!


1-89905
Atreides
2003-11-15 07:26
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский