現在我正在用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;
}
}
}
對你的'CreateProcess'形式的句柄做一個'WaitForSingleObject'(在你的情況下它似乎是'MapPtr-> first')。 –
MapPtr-> first是從CreateProcess存儲的HANDLE。 WaitForSingleObject不會阻塞其他進程嗎?我的意思是如果我有2個同時開始的工作。 –
它不會阻止其他進程,而是阻止您的進程(在您稱之爲的線程中)。所以你要麼在一個單獨的線程中等待每個線程,要麼使用一個專用線程來等待,爲所有「當前」句柄調用「WaitForMultipleObjects」。當然,後者涉及一些跨線程通信,用於傳遞新進程的句柄,並通知進程中某些其他代碼/線程某些進程已完成。 –