Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Останов потока


Автор: Voprosnikov 25.5.2004, 10:55
Здравствуйте!

Подскажите, пожалуйста, как разобраться в след. ситуации...

Есть диалоговое окно, в котором по нажатии кнопочки запускается отдельный поток. По нажатии другой кнопочки этот поток останавливается (примерно как Start и Stop при проигровании звука). Так вот, как правильно обработать закрытие окна когда пользователь нажимает "крестик" в системном меню? в этом случае мне нужно остановить поток, дождавшись пока он закончит текущий цикл. Мне не совсем понятно, как организовать "общение" потока и родителя в этом случае: захватить в потоке mutex и при закрытии окна ждать пока этот mutex освободиться (у меня в этом случае все зависает...) или в обработке сообщения WM_CLOSE не закрывать окно, а только останавливать поток, который при завершении пошлет новое сообщение, в котором и обрабатывать закрытие окна. Одним словом, не знаю, что делать =)

sad.gif

Автор: 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
Код

if(WaitForSingleObject(hThread,INFINITE)==WAIT_TIMEOUT)
TerminateThread(hThread);
CWinApp::OnClose();

Автор: AndyY 25.5.2004, 13:23
Sined
if(WaitForSingleObject(hThread,INFINITE)==WAIT_TIMEOUT)
насколько мне известно, WaitForSingleObject с параметром INFINITE никогда не возвратит WAIT_TIMEOUT

Автор: Sined 25.5.2004, 14:26
Извиняй, напутал.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)