Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
15-1185781382
@!!ex
2007-07-30 11:43
2007.08.26
Delphi глючит или я.


5-1158034357
demonnnn
2006-09-12 08:12
2007.08.26
события


2-1186294194
>>DEATH<<
2007-08-05 10:09
2007.08.26
Как реализовать


2-1185678476
Нова
2007-07-29 07:07
2007.08.26
Сокеты


9-1149643604
Galiaf
2006-06-07 05:26
2007.08.26
Сетевые игры сеть для игры.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский