现在我正在用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”。当然,后者涉及一些跨线程通信,用于传递新进程的句柄,并通知进程中某些其他代码/线程某些进程已完成。 –