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