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

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

Как убить поток...


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 немедленно вернет управление. что позволит тут же отреагировать на него скорейшим и корректным завершением поточной функции.


Наверх

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