2016-08-16 77 views
1

現在我正在用C++編程一個類似cron的調度程序。我的程序能夠在特定時間開始工作並正確安排時間。 什麼讓我煩惱是檢查過程是否仍然存在。啓動過程並稍後識別

所以我有一個地圖JobMap;其中充滿了進程句柄作爲鍵和作爲值的作業。 我怎樣才能把這兩個值聯繫起來?我堅持的一點是,每當我嘗試GetExitCodeProcess它永遠不會返回STILL_ACTIVE。是否有可能爲流程設置唯一的令牌/密鑰,以便我可以識別它並將其與工作聯繫起來?

任何想法將是一個很大的幫助,非常感謝!

void Cron::CheckRunningJobs() 
{ 
    DatNowObj Today; 
    DWORD exitCode = 0; 

    // now iterate through the executed jobs and check their state 
    for(MC_STL_PTR(MapPtr,JobMap)) //MapPtr is a pointer for my map 
    { 
     DatStrNowObj Today; //gives actual date 
     DWORD exitCode = 0; 
     PROT()<<"Job Handle:"<<MapPtr->first <<"Job in Map: "<<MapPtr->second.Job->getDescription()<<endl; 

     // store the exit code for later use 
     MapPtr->second.exitCode = GetExitCodeProcess(MapPtr->first, &exitCode); 
     if(GetExitCodeProcess(MapPtr->first, &exitCode) == STILL_ACTIVE) 
     { 
      PROT()<<"PROCESS STILL ACTIVE"<<endl; 
     } 
     else if(GetExitCodeProcess(MapPtr->first, &exitCode) == ERROR_INVALID_FUNCTION) 
     { 
      CloseHandle(MapPtr->first); 
      continue; 
     } 
     else if(MapPtr->second.execTime) 
     { 

     } 
     else if(GetExitCodeProcess(MapPtr->first, &exitCode) == 0) 
     { 
      CloseHandle(MapPtr->first); 

      JobMap.erase(MapPtr); 

      PROT()<<"Job in Map after Erase: "<<MapPtr->second.Job->getDescription() << "and Map size: " << JobMap.size()<<endl; 
      continue; 
     } 
     else 
     { 
      PROT()<<"Error:"<<GetLastError()<<endl; 
      continue; 
     } 

    } 
} 
+0

對你的'CreateProcess'形式的句柄做一個'WaitForSingleObject'(在你的情況下它似乎是'MapPtr-> first')。 –

+0

MapPtr-> first是從CreateProcess存儲的HANDLE。 WaitForSingleObject不會阻塞其他進程嗎?我的意思是如果我有2個同時開始的工作。 –

+0

它不會阻止其他進程,而是阻止您的進程(在您稱之爲的線程中)。所以你要麼在一個單獨的線程中等待每個線程,要麼使用一個專用線程來等待,爲所有「當前」句柄調用「WaitForMultipleObjects」。當然,後者涉及一些跨線程通信,用於傳遞新進程的句柄,並通知進程中某些其他代碼/線程某些進程已完成。 –

回答

2

請閱讀the documentationuser6545984鏈接。你似乎在這裏變得非常混亂。

GetExitCodeProcess()返回一個BOOL,指示函數是否成功,而不是過程。您正在嘗試使用常數與BOOL進行比較,就好像它是exitCode一樣。但它們是不兼容的類型。即使它們不是,我也不知道爲什麼你會一遍又一遍地調用函數!

要獲得退出代碼,您需要傳入一個LPDWORD指針來接收它。調用函數一次,得到兩個輸出到右側變量 - 一個返回值,一個輸出參數 - 並對這些進行適當的響應。

所以,您需要更改至少這

MapPtr->second.exitCode = GetExitCodeProcess(MapPtr->first, &exitCode); 

喜歡的東西

BOOL result = GetExitCodeProcess(MapPtr->first, &MapPtr->second.exitCode); 

或其他任何地方,你想存儲所說的代碼 - 然後更新所有的比較匹配,也如果需要,請將其與result相比較。

+2

+1 @Majid D. L.只要確保你明白'GetExitCodeProcess'會立即返回*如果進程是'STILL_ACTIVE'。所以要麼不時調用你的函數,要麼同時做其他事情,要麼使用'WaitForSingleObject'或'WaitForMultipleObjects'方法。您不想(意外地)寫一個「busyloop」,它將重複輪詢針對仍在運行的進程的退出代碼。 –

+0

非常感謝!這對我有幫助。我有點盲目地看到它,認爲它會直接返回Exitcode。 –

+0

@ MajidD.L。別客氣。如果這可以幫助你,請註冊。如果它回答您的問題,請使用勾號將其標記爲答案。 –

0
BOOL WINAPI GetExitCodeProcess(
    _In_ HANDLE hProcess, 
    _Out_ LPDWORD lpExitCode 
); 

它並不直接返回退出代碼。瞭解更多信息GetExitCodeProcess

+0

感謝您的回答,我可能會錯誤地使用它。 –

+0

在你的回答中值得一提的是返回的'BOOL'所做的:表示_function_是否成功。 –