2

既存のユーティリティアプリケーションがあります。これをutil.exeと呼びましょう。これは、コマンドラインから入力を受け取り、ディスク上にファイル、たとえば画像ファイルを作成するコマンドラインツールです。

util.exeを実行して、これを別のアプリケーション内で使用したいと思います。ただし、処理を続行するときにファイルが存在することがわかるように、同期する必要があります。

例(psudeo)

bool CreateImageFile(params)
{
  //ret is util.exe program exit code
  int ret = runprocess("util.exe",params);
  return ret==0;
}

プロセスを実行し、プロセスが終了するまで待機する単一のWin32 API呼び出しはありますか?CreateProcessを見ましたが、起動しようとするとすぐに戻ります。ShellExecuteを見ましたが、同期していても少し醜いようです。

4

2 に答える 2

5

単一の API はありませんが、これは実際には Win32 アプリに関するより興味深い一般的な質問です。プロセス ハンドルで CreateProcess または ShellExecuteEx と WaitForSingleObject を使用できます。その時点で GetExitCodeProcess を実行すると、プログラムの終了コードが得られます。簡単なサンプルコードはこちらをご覧ください。

ただし、これによりメイン スレッドが完全にブロックされ、一部の Win32 メッセージング シナリオでは深刻なデッドロックの問題が発生する可能性があります。生成された exe がブロードキャスト sendmessage を行うとしましょう。すべてのウィンドウがメッセージを処理するまで続行できませんが、待機中にブロックされているため、続行できません。デッドロック。ただし、純粋にコマンド ライン プログラムを使用しているため、この問題はおそらく当てはまりません。コマンド ライン プログラムがしばらくハングしてもかまいませんか?

通常のアプリの一般的な最善の解決策は、プロセスの起動と待機をスレッドに分割し、スレッドの実行が完了したときにメイン ウィンドウにメッセージをポストすることです。メッセージを受信すると、続行しても安全であり、デッドロックの問題がないことがわかります。

于 2010-07-28T08:53:23.587 に答える
2

プロセスハンドルは待機可能なオブジェクト、AFAIKです。これはまさにあなたが必要とするものです。

ただし、そのようなことはしないことをお勧めします。Windowsでのプロセスの開始は遅く、UIがブロックされる可能性があります。Windowsアプリケーションから実行するために、50ミリ秒の待機タイムアウトがあるPeekMessageループについて考えてみます。

于 2010-07-28T08:21:29.053 に答える