![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
поток [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 не означет, что поток завершился.