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

#c #qt #qprocess

#c #qt #qprocess

Вопрос:

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

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

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

 Work.close();
  

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

Комментарии:

1. С помощью close вы просто завершаете связь с процессом, вы не убиваете его

2.Что именно program.exe и как вы обычно завершаете его, если запускаете его в командной строке?

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

Ответ №1:

Для этого следует использовать void QProcess::terminate() или void QProcess::kill() .

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

kill() — немедленно завершает процесс.

Комментарии:

1. И даже terminate() или kill() работают только для некоторых программ, а не для всех

2. в unix kill() отправьте сигнал SIGKILL. Этот сигнал не может быть перехвачен или проигнорирован, и принимающий процесс не может выполнить какую-либо очистку после получения этого сигнала. Есть только несколько редких случаев, когда SIGKILL не работает.

3. Мы точно не знаем платформу

4. платформа — Windows 7, и я также пробовал kill(), но я слышал, что не стоит убивать () или завершать () напрямую, потому что любой открытый файл не может быть закрыт приложением, если мы немедленно его уничтожим.

5. В Windows terminate() отправляет сообщение WM_CLOSE во все окна верхнего уровня процесса, а затем в основной поток самого процесса. Таким образом, программа может сохранить файл или запросить у пользователя подтверждение, если это необходимо. Но, конечно, это должно быть реализовано разработчиком программы.

Ответ №2:

У меня был очень похожий случай, хотя я работал над 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
  

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

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