Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.26;
Скачать: CL | DM;

Вниз

Как убить поток...   Найти похожие ветки 

 
Makhanev Alexander   (2007-06-18 15:22) [0]

поток делает WaitForMultipleObjects с INFINITE.

как грамотно уничтожить поток, не дожидаясь одного из Objects?

Terminate и Free не дают результата.

Пока что тока приходит на ум юзать WaitForMultipleObjects  с timeout и цикл..


 
Сергей М. ©   (2007-06-18 15:28) [1]

Использовать, например, MsgWaitForMultipleObjects - этот вызов реагирует на сообщения потоку.

В деструкторе потока посылать ему некое (PostMessage) предопределенное сообщение, например, WM_QUIT. При получении сообщения ф-ция MsgWaitForMultipleObjects немедленно вернет управление. что позволит тут же отреагировать на него скорейшим и корректным завершением поточной функции.


 
Makhanev Alexander   (2007-06-18 15:49) [2]

ок, а как я ему сообщение пошлю, вернее кому? окна-то нет..


 
Сергей М. ©   (2007-06-18 15:57) [3]


> как я ему сообщение пошлю, вернее кому? окна-то нет


Окно и не нужно.

Сообщение можно послать самому потоку (PostThreadMessage), поскольку его ThreadId заведомо известен.

Ф-ция MsgWaitForMultipleObjects реагирует на любые сообщения - как самому потоку, так и любому из окон, потенциально созданных потоком.


 
Makhanev Alexander   (2007-06-18 16:02) [4]

добавил в массив объектов handle этого же потока.

пока вроде нормально работает.

при Terminate через секунду-две WaitForMultipleObjects возвращает
результат.

как вам такой вариант ?


 
Сергей М. ©   (2007-06-18 16:13) [5]

Не понял ...

Ты же сказал, что ф-цию ожидания вызывает сам доп.поток ?

Тогда у тебя получается, что поток ждет завершение самого себя, что есть полный бред..


 
Makhanev Alexander   (2007-06-18 16:21) [6]

я так понял, что когда из управляющей программы я делаю terminate, то в потоке происходит event  и поэтому WaitForMultipleObjects  возвращает резалт на handle потока..


 
Однокамушкин   (2007-06-18 16:23) [7]

Сделать ещё одно событие, хэндл которого добавить в список объектов, ожидаемых WaitForMultipleObjects, и при необходимости завершения из главной нити устанавливать это событие...


 
Сергей М. ©   (2007-06-18 16:28) [8]


> я так понял, что когда из управляющей программы я делаю
> terminate, то в потоке происходит event


Ничего подобного.

Вызов метода Terminate не делает ничего иного, кроме как установку св-ва Terminated в True.

Если доп.поток не проверяет значение этого св-ва (а он у тебя как раз и не проверяет, будучи блокированным на неопредел. время исполнением ф-ции WaitForMultipleObjects), то вызов метода Terminate - что мертвому припарка.


 
Makhanev Alexander   (2007-06-18 18:57) [9]

хм..  видимо просто поток периодически ловит другие события, потому и выходит из ожидания...  логично?

и эти события генерю не я, а система.


 
Makhanev Alexander   (2007-06-18 19:17) [10]

гоню. нашел почему оно так было, это один из event"ов частенько возникает, потому и создавалась видимость корректной работы.

я создал event через createevent, добавил его в массив для WaitForMultipleObjects. но как поднять event ?  пока что SetEvent и PulseEvent мне не помогают...


 
Makhanev Alexander   (2007-06-18 19:25) [11]

всё, косяк найден (размер массива event ов в WaitForMultipleObjects был неверный), всем спасибо!



Страницы: 1 вся ветка

Текущий архив: 2007.08.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.214 c
2-1185786383
tytus
2007-07-30 13:06
2007.08.26
MS Excel - Как закрасить диапазон ячеек ?


5-1160386111
Prohor
2006-10-09 13:28
2007.08.26
Где взять нормальный DbGridEh


15-1185772722
boriskb
2007-07-30 09:18
2007.08.26
Поздравим.


15-1185293461
Slimer
2007-07-24 20:11
2007.08.26
Джойстик вместо мыши


2-1184414949
MRAk
2007-07-14 16:09
2007.08.26
Ужасно ли использование таймера