Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Akon от Ноябрь 28, 2011, 11:27



Название: Корректное завершение дочернего процесса под Windows
Отправлено: 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);


Название: Re: Корректное завершение дочернего процесса под Windows
Отправлено: Bepec от Ноябрь 28, 2011, 12:05
А помоему корректное завершение дочернего потока должно осуществляться самим дочерним процессом. Не?
А то что вы делаете - это сдирание шкуры с живого процесса.


Название: Re: Корректное завершение дочернего процесса под Windows
Отправлено: Igors от Ноябрь 28, 2011, 12:20
А то что вы делаете - это сдирание шкуры с живого процесса.
Ну иногда приходится и сдирать  :)

Я делал через WinAPI ::TerminateProcess (сначала ::OpenProcess). Правда проверял аж один раз - вроде прибивается.


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

Резюмирую:
WM_CLOSE + WM_QUIT - корректно.
WM_CLOSE без WM_QUIT - содранная шкура с живого процесса (окон нет, а цикл сообщений крутится).
WinAPI::TerminateProcess - выстрел в голову (крайняя мера, отстрел зависших процессов).


Название: Re: Корректное завершение дочернего процесса под Windows
Отправлено: thechicho от Ноябрь 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 (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)


Название: Re: Корректное завершение дочернего процесса под Windows
Отправлено: Bepec от Ноябрь 29, 2011, 08:26
Ну в Qt потоках/процессах терминате рубит сразу все. (насчет процессов полностью не уверен)