2016-10-09 8 views
0

CreateProcessにコマンドを渡してプロセスのグループを起動するはずの関数があります。私はこの関数を2回連続して呼び出していますが、関数は何とか終了し、最初のグループのプロセスが終了する前に2回目に呼び出されます。WaitForMultipleObjectsが待機していません

終了するプロセスが1つのみを待っているようです。プロセスの最初のグループ からアプリケーションの1つを閉じると、次のバッチ が起動します。

私はアプリケーショングループを一緒に起動し、これらのプロセスがすべて終了すると次のグループを起動します。私のWaitForMultipleObjectsコールが、グループ内のすべてのプロセスが終了するのを待っていないのはなぜですか?

void ProcessLauncher::launch_processes(PROCESS_LIST_TYPE& processes) 
{ 
unsigned long const CP_MAX_COMMANDLINE = 32768; 
VECTOR_TYPE<PROCESS_INFORMATION> procs; 
VECTOR_TYPE<HANDLE> pHandles; 

for (auto proc : processes) 
{ 
STRING_TYPE command = proc.program_name + L" " + proc.params; 
STARTUPINFO sinfo = { 0 }; 
sinfo.cb = sizeof(STARTUPINFO); 
PROCESS_INFORMATION pi = { 0 }; 
try { 
    CHAR_TYPE* commandline = new CHAR_TYPE[CP_MAX_COMMANDLINE]; 
    wcsncpy_s(commandline, CP_MAX_COMMANDLINE, command.c_str(), command.size() + 1); 
    CreateProcess(nullptr, 
     commandline, 
     nullptr, 
     nullptr, 
     false, 
     0, 
     nullptr, 
     nullptr, 
     &sinfo, 
     &pi); 

    delete[]commandline; 

    CloseHandle(pi.hThread); 

    procs.push_back(pi); 
    pHandles.push_back(pi.hProcess); 
} 
catch (std::bad_alloc&) { 
    std::wcerr << L"Insufficient memory to launch application" << std::endl; 
     return; 
    } 
} 

if (WAIT_FAILED == WaitForMultipleObjects(pHandles.size(), pHandles.data(), TRUE, INFINITE)) 
    std::wcout << L"Failure waiting for process to terminate" << std::endl; 
} 
+0

関数を呼び出すたびにリストに含まれるプロセスの数はいくつですか? – conio

+0

@conio現在のところ、それぞれの呼び出しには2つしかありません。 – CanadaIT

+0

@conio待っていることについてのいくつかの細部について言及するのを忘れてしまった。私は質問にブロッククォートでそれらを加えました。 2番目のバッチは、最初のグループのプロセスの1つを終了すると起動されます。 – CanadaIT

答えて

0

私は、CreateProcess呼び出しでプロセスを作成できませんでしたが、私はまだベクトルにハンドルを追加していました。 CreateProcessがTRUEに等しい値を返した場合にのみハンドルをベクトルに追加するように変更しました。

関連する問題