Russian Qt Forum
Ноябрь 22, 2024, 23:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Корректное завершение дочернего процесса под Windows  (Прочитано 5296 раз)
Akon
Гость
« : Ноябрь 28, 2011, 11:27 »

По докам это QProcess::terminate. Но там по ходу косяк, нигде не посылается WM_QUIT, соответственно процесс, лишившись всех окон, остается жить.

Код:
// Qt 4.7.4, file qprocess_win.cpp
void QProcessPrivate::terminateProcess()
{
    if (pid) {
        EnumWindows(qt_terminateApp, (LPARAM)pid->dwProcessId);
        PostThreadMessage(pid->dwThreadId, WM_CLOSE, 0, 0);  // WM_QUIT here
    }
}

Корректное завершение в вашем коде
Код:
process.terminate();  // closing top level windows (WM_CLOSE)
PostThreadMessage(process.pid()->dwThreadId, WM_QUIT, ExitCode, 0);
Записан
Bepec
Гость
« Ответ #1 : Ноябрь 28, 2011, 12:05 »

А помоему корректное завершение дочернего потока должно осуществляться самим дочерним процессом. Не?
А то что вы делаете - это сдирание шкуры с живого процесса.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Ноябрь 28, 2011, 12:20 »

А то что вы делаете - это сдирание шкуры с живого процесса.
Ну иногда приходится и сдирать  Улыбающийся

Я делал через WinAPI ::TerminateProcess (сначала ::OpenProcess). Правда проверял аж один раз - вроде прибивается.
Записан
Akon
Гость
« Ответ #3 : Ноябрь 28, 2011, 13:44 »

А помоему корректное завершение дочернего потока должно осуществляться самим дочерним процессом. Не?
А то что вы делаете - это сдирание шкуры с живого процесса.
Процессу посылается последовательность сообщений, соответствующая именно корректному завершению. А кто посылает сообщения ОС (например, когда вы делаете Alt+F4) или другой процесс - фиолетово.

Резюмирую:
WM_CLOSE + WM_QUIT - корректно.
WM_CLOSE без WM_QUIT - содранная шкура с живого процесса (окон нет, а цикл сообщений крутится).
WinAPI::TerminateProcess - выстрел в голову (крайняя мера, отстрел зависших процессов).
Записан
thechicho
Гость
« Ответ #4 : Ноябрь 28, 2011, 17:36 »

// выстрел в голову
http://lurkmore.ru/%D0%92%D1%8B%D1%81%D1%82%D1%80%D0%B5%D0%BB%D0%B8%D1%82%D1%8C_%D1%81%D0%B5%D0%B1%D0%B5_%D0%B2_%D0%BD%D0%BE%D0%B3%D1%83
Записан
Bepec
Гость
« Ответ #5 : Ноябрь 29, 2011, 08:26 »

Ну в Qt потоках/процессах терминате рубит сразу все. (насчет процессов полностью не уверен)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.072 секунд. Запросов: 22.