Главная страница
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.028 c
1-1182168028
bobah
2007-06-18 16:00
2007.08.26
Приведение к типу Single


2-1185950827
Mishenka
2007-08-01 10:47
2007.08.26
Не переписывается метод SetWidth


15-1184227968
Сатир
2007-07-12 12:12
2007.08.26
Разработка под Windows Mobile 5.0


2-1185639518
sproot
2007-07-28 20:18
2007.08.26
открытие формы при нажатие кнопки


15-1185260598
boriskb
2007-07-24 11:03
2007.08.26
"Кысь"