3

QProcess オブジェクトのリストを使用して、ユーザー定義の間隔で開始/停止する必要があるプロセスを追跡しています。

プロセスを開始および停止できます。しかし、次の方法 (疑似コード) を使用してプロセスを停止すると、問題が発生します。

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

ただし、別の時点でプロセスを再度開始しようとすると、次のエラーが発生します。

QProcess::start:  Process is already running

ps -ef|grep processName を実行すると、実際に停止していることがわかりますが、機能していない状態にあるため、再起動できないと思います。

この廃止された状態を防ぐために、または廃止されたメソッドを削除して、再構築せずにプロセスを再開するにはどうすればよいですか?

4

2 に答える 2

8

エラーの原因を突き止めました。

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.

皆さんありがとう。

于 2011-08-19T13:32:33.260 に答える
2

ゾンビプロセスを刈り取るために呼び出してprocess->waitForFinished()から呼び出します。process->terminate()その後、プロセス オブジェクトを再利用できます。

于 2011-08-18T20:35:32.907 に答える