QProcess exe не закрывается, если программа завершена

Моя проблема в том, что я запускаю исполняемый файл в QProcess следующим образом:

QProcess Work;
Work.start(program.exe);

Этот исполняемый файл работает, так как он был запущен в фоновом режиме, и я могу отправлять ему запросы. Если я закончил, я закрываю исполняемый файл следующим образом:

Work.close();

Но если я смотрю в диспетчере задач, программа.exe работает, кроме того. Я не понимаю такого поведения, потому что думал, что исполняемый файл будет остановлен, если я закрою процесс.


person Lehtim    schedule 30.09.2016    source источник
comment
С помощью close вы просто завершаете общение с процессом, вы его не убиваете.   -  person demonplus    schedule 30.09.2016
comment
Что именно является program.exe и как вы обычно завершаете его, если запускаете его из командной строки?   -  person G.M.    schedule 30.09.2016
comment
program.exe — это программа, которая запускает параллельный поток для связи с другим IP-адресом. В исполняемом файле есть команда завершения, и я думаю, что буду использовать эту команду, потому что я обнаружил, что убивать процесс очень плохо.   -  person Lehtim    schedule 30.09.2016


Ответы (2)


Вы должны использовать void QProcess::terminate() или void QProcess::kill() для него.

terminate() - пытается завершить процесс.

kill() - немедленно убивает процесс.

person Konstantin T.    schedule 30.09.2016
comment
И даже terminate() или kill() работают только для некоторых программ не для всех - person demonplus; 30.09.2016
comment
в unix kill() отправить сигнал SIGKILL. Этот сигнал нельзя перехватить или проигнорировать, и процесс получения не может выполнить какую-либо очистку после получения этого сигнала. Есть всего несколько редких случаев, когда SIGKILL не работает. - person Konstantin T.; 30.09.2016
comment
Мы не знаем точно платформу - person demonplus; 30.09.2016
comment
платформа - Windows 7, и я также пробовал kill(), но я слышал, что это не очень хорошая идея, чтобы убить() или прекратить() напрямую, потому что любой открытый файл не может быть закрыт приложением, если мы убиваем его немедленно. - person Lehtim; 30.09.2016
comment
В Windows функция terminate() посылает сообщение WM_CLOSE всем окнам верхнего уровня процесса, а затем основному потоку самого процесса. Таким образом, программа может сохранить файл или запросить подтверждение у пользователя, если это необходимо. Но конечно это должен реализовать разработчик программы. - person Konstantin T.; 30.09.2016
comment
согласно документации, close() уже использует kill: void QProcess::close(): Closes all communication with the process and kills it. ... - person smerlin; 05.10.2016

У меня был очень похожий случай, хотя я работал на Linux со встроенным QT 4.8. Не уверен, что это может вам помочь, но, поскольку я не могу поместить это в комментарий, я должен сделать отдельный ответ.

Вы устанавливаете родителя для своего QProcess? В моем случае я создал экземпляр QProcess следующим образом.

QProcess *p = new QProcess;

и я мог видеть в списке запущенных процессов, что каждый раз, когда я создавал новый экземпляр QProcess, я получал новый процесс, который не мог быть закрыт с помощью close(), terminate() или kill(). Когда я, наконец, переписал код вот так

QProcess *p = new QProcess(mainW); //mainW was my GUI class, which handled also the closing of the process

проблема решилась сама собой, мне даже не нужно было вызывать какую-либо функцию, чтобы закрыть процесс. В моем случае я был уверен, что процессы, которые я вызывал, завершались, так как почти все они были аудиофайлами, поэтому я мог слышать их завершение. Другие были процессами, которые моя программа ждала завершения, поэтому я снова был уверен, что они завершились, потому что моя программа не застряла в ожидании их,

Надеюсь, это может помочь, несмотря на другую ОС.

person il_boga    schedule 06.10.2016