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

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

Узнать о завершении работы потока, как? [D7, WinXP]


Страницы:   1 2

tipman ©   (2009-12-29 11:51:00) 

Есть основной поток, из него создаю ещё один. Он отрабатывает и завершается сам, т.е. FreeOnTerminate = true. Мне его завершать не надо. Как узнать из основного потока, закончил ли выполнение созданный, стандартными средствми? На данный момент есть переменная, которая в create потока устанавливается в true, в конце Execute, ну или OnTerminate она ставится в false. Думал если он завершается и должен сам разрушаться, попробвать проверить на nil - не тут то было, дескриптор не очищается. Как то можно это сделать не добавлением переменных а какой нить проверкой стандартного свойства скажем или типа того


Сергей М.   (2010-01-01 19:27:00) [21]


> И все дела


Ну где же "все" ?
Есть факт обnilения какой-то там переменной, а где факт завершения работы поточной ф-ции ?
Нет его.
Даже после новогодней стопки)


Германн   (2010-01-01 03:29:00) [22]


> После шампанского это очень даже занимательное занятие :
> )

Ни разу не пробовал.
А до следующего раза ещё
355 дней :(

P.S. После водки пробовал, но то были обычные будни.


Rouse_   (2010-01-01 02:51:00) [23]

Ну у меня есть уважительная причина - я отлаживаю собственнописанный отладчик :) После шампанского это очень даже занимательное занятие :)


Германн   (2010-01-01 02:47:00) [24]


> Rouse_ ©   (01.01.10 02:36) [12]
>
>

Хакер всегда и везде хакер! Даже почти в 3 ночи 1-го января. :)


Rouse_   (2010-01-01 02:36:00) [25]


> Сергей М. ©   (30.12.09 21:18) [10]
> Нахрена ? Если персонально полученный хендл треда прямо
> перед носом ?

Сереж, не пыли. Это был ответ на вопрос "Как узнать из основного потока, закончил ли выполнение созданный, стандартными средствми".

Под стандартными средствами я подразумеваю нечто уже реализованное, а не то, что еще предстоит реализовать :)


Юрий Зотов   (2009-12-31 10:45:00) [26]

Чего-то я не понимаю, наверное. Решение-то самое стандартное и лежит на поверхности - так на фига же извращаться?

FThread := TMyThread.Create(True); // FThread - поле формы.
FThread.FreeOnTerminate := True;
FThread.OnTerminate := ThreadTerminate; // ThreadTerminate - метод формы
FThread.Resume;

procedure TForm1.ThreadTerminate(Sender: TObject);
begin
 FThread := nil
end;

Теперь в любом месте можно проверить поле FThread - если оно не nil, то поток еще работает. И все дела.


Сергей М.   (2009-12-30 21:18:00) [27]


> достаточно сказать GetThreadContext (или вариации


Нахрена ? Если персонально полученный хендл треда прямо перед носом ?


Rouse_   (2009-12-30 17:29:00) [28]

Ну для проверки из вне жив или нет, достаточно сказать GetThreadContext (или вариации OpenThread и т.п.)


Сергей М.   (2009-12-30 14:55:00) [29]

with MyThread do
try
CheckThreadError(GetExitCodeThread(Handle)<>0);


Сергей М.   (2009-12-30 13:19:00) [30]


> Мне нужно чтобы основной поток тоже работал


Можно поступить так - как только осн.потоку будет нефига делать и он остановится "покурить", возникнет событие Application.OnIdle.
В его обработчике ты волен проверить, не закруглился ли на сей момент твой доп.поток по хозяйству, и если закруглился то уничтожить его.

Примерно так:

with MyThread do
try
 GetExitCodeThread(.CheckThreadError(GetExitCodeThread(Handle)<>0);
// доп.поток гарантированно закруглился - здесь можно забрать у него результаты работы
// перед тем как уничтожить его
 Free; // уничтожение доп.потока
except
 on EThread do; // доп.поток еще жив и трудится
else
 raise; // произошло что-то еще, например, ты забыл или не захотел убрать строчку FreeOnTerminate := True    -  получи букет граблей
end;


tipman   (2009-12-30 12:53:00) [31]

Сергей М.

Мне нужно чтобы основной поток тоже работал, а не тормозил, с WaitFor он засыпает. Т.е. опять же тольло либо с симафорами, либо сообщениями? Больше никак?


Сергей М.   (2009-12-29 21:20:00) [32]

Ишшо один)


~AQUARIUS~   (2009-12-29 20:02:00) [33]

TThread.OnTerminate?


Медвежонок Пятачок   (2009-12-29 12:28:00) [34]

легче тогда и сам поток убрать. и ждать ничего не придется.


Сергей М.   (2009-12-29 12:14:00) [35]

> Он отрабатывает и завершается сам, т.е. FreeOnTerminate = true

Убирай FreeOnTerminate = true.

В осн.потоке вызывай

MyThread.WaitFor;
.. здесь доп.поток ГАРАНТИРОВАННО завершил свое исполнение ..
MyThread.Free; //а здесь он прекратил свое существование


Sergey Masloff   (2009-12-29 11:54:00) [36]

Послать сообщение основному потоку при завершении?


Страницы:   1 2

Наверх

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