| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Останов потока |
| Автор: Voprosnikov 25.5.2004, 10:55 |
| Здравствуйте! Подскажите, пожалуйста, как разобраться в след. ситуации... Есть диалоговое окно, в котором по нажатии кнопочки запускается отдельный поток. По нажатии другой кнопочки этот поток останавливается (примерно как Start и Stop при проигровании звука). Так вот, как правильно обработать закрытие окна когда пользователь нажимает "крестик" в системном меню? в этом случае мне нужно остановить поток, дождавшись пока он закончит текущий цикл. Мне не совсем понятно, как организовать "общение" потока и родителя в этом случае: захватить в потоке mutex и при закрытии окна ждать пока этот mutex освободиться (у меня в этом случае все зависает...) или в обработке сообщения WM_CLOSE не закрывать окно, а только останавливать поток, который при завершении пошлет новое сообщение, в котором и обрабатывать закрытие окна. Одним словом, не знаю, что делать =) |
| Автор: shedon 25.5.2004, 11:08 |
| Завершить поток можно через ::TerminateThread. |
| Автор: AndyY 25.5.2004, 11:22 |
| Очень не рекомендую использовать TerminateThread. Обернется потерей ресурсов, ликами итд. Самое простое, что можно сделать - на закрытии диалога (например, WM_CLOSE) SetEvent( event_stop ); WaitForSingleObject( thread_handle, INFINITE ); CloseHandle( thread_handle ); в thread проверять if( WaitForSingleObject (event_stop, 0 )== WAIT_OBJECT_0 ) пора сваливать. goto _end; как вариант - использовать exception только если есть вероятность, что поток зависнет (например, если он енумит сеть или делает что-то подобное) - тогда if( WaitForSingleObject( thread_handle, 5000 ) == WAIT_TIMEOUT) TerminateThread( thread_handle ) |
| Автор: Sined 25.5.2004, 11:29 | ||
| Скорее всего может сработать и следующий код Рбработчик OnClose в mfc
|
| Автор: AndyY 25.5.2004, 13:23 |
| Sined if(WaitForSingleObject(hThread,INFINITE)==WAIT_TIMEOUT) насколько мне известно, WaitForSingleObject с параметром INFINITE никогда не возвратит WAIT_TIMEOUT |
| Автор: Sined 25.5.2004, 14:26 |
| Извиняй, напутал. |