Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

поток [D2005, XP]


авыф ©   (2007-06-07 12:27:00) 

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


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


> SpellCaster   (07.06.07 15:05) [6]


[7] - это раз.

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


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


> SpellCaster   (07.06.07 15:05) [6]


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


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

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

if MyThread.FinishedExecutin then ...


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

Уточнение:

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


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


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


и


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


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


см. метод WaitFor.


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


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

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


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


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

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

> TThread.OnTerminate

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


clickmaker   (2007-06-07 12:40:00) [7]


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

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


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

TThread.OnTerminate


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо