1

現在、複数のプログラムをグループで一度に実行し、他のプログラムを単独で実行するプログラムを作成しています。

if( WAIT_FAILED == WaitForMultipleObjects(numberOfProgramsRan, &information[i].hProcess, TRUE, INFINITE) ) { wcerr << L"Failure waiting for process" << endl; }

numberOfProgramsRanループで実行したプログラムの数です。 作成プロセスからのプロセス情報を保持してい&information[i]ますvector

forループでプロセスを作成すると、次のプロセスを実行する前に、作成中のプロセスが2つ以下の場合(実行するために2つのプログラムが渡される場合)、プログラムは待機します。2 つ以上のプロセスを作成する (またはベクターで 2 つ以上のプログラムを渡す)WaitForMultipleObjectsと、失敗します。

私の問題をさらに説明する必要がある場合は、お知らせください。

ご協力いただきありがとうございます

4

3 に答える 3

5

単一のプロセス (インデックス i) のみを待機する場合は、WaitForSingleObject を使用する必要があります。複数のプロセスを待っている場合は、PROCESS_INFORMATION へのポインタではなく、他の人が言ったようにハンドルの配列を渡す必要があります。単一のオブジェクトの使用に WaitFoRmultipleObjects を使用することを主張する場合:

WaitForMultipleObjects(1, &information[i].hProcess, TRUE, INFINITE)

1 以外のものを使用する場合は、PROCESS_INFORMATION の定義を見てください。

typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;
  HANDLE hThread;
  DWORD  dwProcessId;
  DWORD  dwThreadId;
} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;

次の dwProcessId と dwThreadID は、呼び出しが期待どおりに機能しないハンドルとして誤って扱われます。

何かのようなもの:

HANDLE hProcess[MAX_PROCESSES];
for(int i=0; i<numberOfProgramsRan; i++)
{
  hProcess[i] = information[i].hProcess;
}
WaitForMultipleObjects(numberOfProgramsRan, hProcess, TRUE, INFINITE);

すべてのプロセスを待機します。

于 2011-05-28T23:10:21.213 に答える
3

これは、要素を含む s&information[i].hProcessの配列の最初の要素へのポインタである必要があります。あなたの説明では、そうではないように聞こえるので、それがどのように機能すると想像するのかわかりません。HANDLEnumberOfProgramsRan

于 2011-05-28T22:50:24.187 に答える
2

HANDLE の配列へのポインターを渡していることを確認してください (公式ドキュメントを参照してください)。何であるかはわかりませんがinformation[i].hProcess、構造体/クラスに含まれる単一の HANDLE メンバーのように見えます。それが単一のハンドルである場合、あなたが言及したように、2つではなく1つのプロセスでのみ機能すると予想されます。

ここでプロセスの定義informationと初期化/作成方法を示すと、コードを最小サイズに縮小して問題を再現できる場合があります。「失敗」の詳細も役立つ場合があります(エラー/例外メッセージ、何が起こるかなど...)。

于 2011-05-28T22:49:36.490 に答える