QProcess перестает работать и не может начать снова - PullRequest
3 голосов
/ 19 августа 2011

Я использую список объектов QProcess для отслеживания некоторых процессов, которые нужно запускать / останавливать через определенные пользователем интервалы.

Я могу запускать и останавливать процессы в порядке.Но проблема возникает, когда я останавливаю процесс, используя следующие методы (псевдокод):

process->start("PathToProcess","Some Arguments");
//Do some stuff.
process->terminate();

Однако, если я пытаюсь запустить процесс снова в другое время, я получаю сообщение об ошибке:

QProcess::start:  Process is already running

Я могу сделать ps -ef | grep processName и обнаружить, что он действительно мертв, но он находится в неработающем состоянии, которое, как мне кажется, не позволяет мне запустить его снова.

Что мне делать?нужно сделать, чтобы предотвратить это несуществующее состояние или удалить несуществующий метод, чтобы я мог начать свой процесс заново без реконструкции?

Ответы [ 2 ]

7 голосов
/ 19 августа 2011

Выяснили причину ошибки.

В qprocess_unix.cpp вы найдете класс с именем QProcessManager.По сути этот класс имеет обработчики сигналов, которые следят за дочерними процессами, которые умерли.Когда дочерний элемент умирает, QProcessManager отправляет сообщение через канал, который сообщает классу QProcess, что он завершился / умер.

В несвязанной части моего кода я настроил несколько операторов перехвата сигналов, которые я использовал для различных целей.Однако эти перехваты сигнала улавливали мое событие SIGCHLD, и, таким образом, QProcessManager никогда не запускался, чтобы передать QProcess, что он умер.

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

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

process->setProcessState(ProcessState::NotRunning);//Specify the process is no longer running
waitpid(process->pid(),NULL,WNOHANG); //Clear the defunct process.

Спасибо всем.

2 голосов
/ 19 августа 2011

Позвоните process->waitForFinished() после вызова process->terminate(), чтобы пожинать процесс зомби.Затем вы можете повторно использовать объект процесса.

...