![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Voprosnikov |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 19.3.2004 Репутация: нет Всего: нет |
Здравствуйте!
Подскажите, пожалуйста, как разобраться в след. ситуации... Есть диалоговое окно, в котором по нажатии кнопочки запускается отдельный поток. По нажатии другой кнопочки этот поток останавливается (примерно как Start и Stop при проигровании звука). Так вот, как правильно обработать закрытие окна когда пользователь нажимает "крестик" в системном меню? в этом случае мне нужно остановить поток, дождавшись пока он закончит текущий цикл. Мне не совсем понятно, как организовать "общение" потока и родителя в этом случае: захватить в потоке mutex и при закрытии окна ждать пока этот mutex освободиться (у меня в этом случае все зависает...) или в обработке сообщения WM_CLOSE не закрывать окно, а только останавливать поток, который при завершении пошлет новое сообщение, в котором и обрабатывать закрытие окна. Одним словом, не знаю, что делать =) |
|||
|
||||
| shedon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1209 Регистрация: 17.1.2003 Где: Нижнiй Новгородъ Репутация: 4 Всего: 11 |
Завершить поток можно через ::TerminateThread.
-------------------- Programming is like sex: One mistake and you have to support it your lifetime |
|||
|
||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
Очень не рекомендую использовать 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 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 78 Регистрация: 19.5.2004 Репутация: 1 Всего: 0 |
Скорее всего может сработать и следующий код
Рбработчик OnClose в mfc
|
|||
|
||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
Sined
if(WaitForSingleObject(hThread,INFINITE)==WAIT_TIMEOUT) насколько мне известно, WaitForSingleObject с параметром INFINITE никогда не возвратит WAIT_TIMEOUT |
|||
|
||||
| Sined |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 78 Регистрация: 19.5.2004 Репутация: 1 Всего: 0 |
Извиняй, напутал.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |