Главная страница
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.022 c
15-1180798178
Иксик
2007-06-02 19:29
2007.07.01
Парк советского периода


15-1180537337
Rule
2007-05-30 19:02
2007.07.01
демо ролик с сайта борланда


15-1180607764
ZeroDivide
2007-05-31 14:36
2007.07.01
Asus - ацтой


15-1180804496
Sh7777
2007-06-02 21:14
2007.07.01
вопрос


15-1180853875
Kolan
2007-06-03 10:57
2007.07.01
Гистограмма уровней &amp;#151; это как?