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

Вниз

поток   Найти похожие ветки 

 
авыф   (2007-06-07 12:27) [0]

создаю свой поток TThread, создаю его в отдельном юните, потом из главного модуля делаю его Terminate, так вот как мне узнать что поток завершился из главного модуля? прочитал в справке что есть функция Terminated, но она protected, т.е. недоступна где-либо кроме потока, пробовал так:
If Th<>nil then ... , но он не nil, хотя я его вроде уничтожил, не подскажете как мне отловить что поток уничтожен?


 
Рамиль ©   (2007-06-07 12:33) [1]

TThread.OnTerminate


> прочитал в справке что есть функция Terminated

Неправильно прочитал. Terminated не означет, что поток завершился.


 
авыф   (2007-06-07 12:40) [2]


> Неправильно прочитал. Terminated не означет, что поток завершился.

ну она показывает уничтожен поток или нет...

> TThread.OnTerminate

ну она вызывается только когда только что поток завершился, а вот как например узнать через 10 секунд что поток был завершен? handle тоже у потока остается, я думал что при Terminate, полностью высвобождаются ресурсы...
по-крайне мере когда используешь THandle и CreateThread, там когда вызываешь Terminate  то Th=nil...
хотелось бы с TThread тоже так проделать, или это нереально?


 
clickmaker ©   (2007-06-07 12:40) [3]


> как мне отловить что поток уничтожен?

в какой момент?
есть GetExitCodeThread(), TThread.WaitFor


 
Сергей М. ©   (2007-06-07 12:48) [4]


> поток завершился


и


> поток уничтожен


- это две разные вещи. Вторая подразумевает первую, но не наоборот.
> как мне узнать что поток завершился


см. метод WaitFor.


> как мне отловить что поток уничтожен?


При условии FreeOnTerminate:

1. Создать поток в suspended-состоянии.
2. Получить дубликат его хэндла (DuplicateHandle).
3. Вызовами любой из WinAPI-функций ожидания ([Msg]WaitForXXXXX) дождаться сигнала завершения потока.
4. Закрыть хэндл-дубликат (CloseHandle)


 
Сергей М. ©   (2007-06-07 12:51) [5]

Уточнение:

1. Создать поток в suspended-состоянии.
2. Получить дубликат его хэндла (DuplicateHandle), при необходимости перевести поток в состояние resumed.
3. Вызовами любой из WinAPI-функций ожидания ([Msg]WaitForXXXXX) дождаться сигнала завершения потока, убедившись перед этим, что поток находится в состоянии resumed (при состоянии suspended перевести его в состояние resumed)
4. Закрыть хэндл-дубликат (CloseHandle)


 
SpellCaster   (2007-06-07 15:05) [6]

Зачем так усложнять, если можно перед выходом из Execute прописать присвоение какой-либо булевской переменной... да хотя бы в члены класса ее запихнуть. А потом проверять из любого места

if MyThread.FinishedExecutin then ...


 
Сергей М. ©   (2007-06-07 15:30) [7]


> SpellCaster   (07.06.07 15:05) [6]


Дурнее решения, чем чтение переменной в цикле, придумать сложно)


 
Сергей М. ©   (2007-06-07 15:35) [8]


> SpellCaster   (07.06.07 15:05) [6]


[7] - это раз.

Факт установки флага FinishedExecutin не есть факт завершения интересующего потока, тем более не есть факт его уничтожения - это два.



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

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

Наверх




Память: 0.48 MB
Время: 0.019 c
15-1180700742
Настя
2007-06-01 16:25
2007.07.01
Мы опять к вам за помощью


2-1181276047
KJ
2007-06-08 08:14
2007.07.01
Выделить строку ListView целиком


2-1180983976
serg777
2007-06-04 23:06
2007.07.01
Закрасить фон


2-1181129557
TIF
2007-06-06 15:32
2007.07.01
Картинки в Браузере


15-1180543534
Курдль
2007-05-30 20:45
2007.07.01
Эх, бросить бы все дела, да махнуть в Урюпинск!..