Форум: "Начинающим";
Текущий архив: 2007.07.01;
Скачать: [xml.tar.bz2];
Внизпоток Найти похожие ветки
← →
авыф (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c