![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как убить поток...
Makhanev Alexander © (2007-06-18 15:22:00)поток делает WaitForMultipleObjects с INFINITE.
как грамотно уничтожить поток, не дожидаясь одного из Objects?
Terminate и Free не дают результата.
Пока что тока приходит на ум юзать WaitForMultipleObjects с timeout и цикл..
Makhanev Alexander (2007-06-18 19:25:00) [1]всё, косяк найден (размер массива event ов в WaitForMultipleObjects был неверный), всем спасибо!
Makhanev Alexander (2007-06-18 19:17:00) [2]гоню. нашел почему оно так было, это один из event'ов частенько возникает, потому и создавалась видимость корректной работы.
я создал event через createevent, добавил его в массив для WaitForMultipleObjects. но как поднять event ? пока что SetEvent и PulseEvent мне не помогают...
Makhanev Alexander (2007-06-18 18:57:00) [3]хм.. видимо просто поток периодически ловит другие события, потому и выходит из ожидания... логично?
и эти события генерю не я, а система.
Сергей М. (2007-06-18 16:28:00) [4]
> я так понял, что когда из управляющей программы я делаю
> terminate, то в потоке происходит event
Ничего подобного.
Вызов метода Terminate не делает ничего иного, кроме как установку св-ва Terminated в True.
Если доп.поток не проверяет значение этого св-ва (а он у тебя как раз и не проверяет, будучи блокированным на неопредел. время исполнением ф-ции WaitForMultipleObjects), то вызов метода Terminate - что мертвому припарка.
Однокамушкин (2007-06-18 16:23:00) [5]Сделать ещё одно событие, хэндл которого добавить в список объектов, ожидаемых WaitForMultipleObjects, и при необходимости завершения из главной нити устанавливать это событие...
Makhanev Alexander (2007-06-18 16:21:00) [6]я так понял, что когда из управляющей программы я делаю terminate, то в потоке происходит event и поэтому WaitForMultipleObjects возвращает резалт на handle потока..
Сергей М. (2007-06-18 16:13:00) [7]Не понял ...
Ты же сказал, что ф-цию ожидания вызывает сам доп.поток ?
Тогда у тебя получается, что поток ждет завершение самого себя, что есть полный бред..
Makhanev Alexander (2007-06-18 16:02:00) [8]добавил в массив объектов handle этого же потока.
пока вроде нормально работает.
при Terminate через секунду-две WaitForMultipleObjects возвращает
результат.
как вам такой вариант ?
Сергей М. (2007-06-18 15:57:00) [9]
> как я ему сообщение пошлю, вернее кому? окна-то нет
Окно и не нужно.
Сообщение можно послать самому потоку (PostThreadMessage), поскольку его ThreadId заведомо известен.
Ф-ция MsgWaitForMultipleObjects реагирует на любыесообщения - как самому потоку, так и любому из окон, потенциально созданных потоком.
Makhanev Alexander (2007-06-18 15:49:00) [10]ок, а как я ему сообщение пошлю, вернее кому? окна-то нет..
Сергей М. (2007-06-18 15:28:00) [11]Использовать, например, MsgWaitForMultipleObjects - этот вызов реагирует на сообщения потоку.
В деструкторе потока посылать ему некое (PostMessage) предопределенное сообщение, например, WM_QUIT. При получении сообщения ф-ция MsgWaitForMultipleObjects немедленно вернет управление. что позволит тут же отреагировать на него скорейшим и корректным завершением поточной функции.