启动流程并在以后进行识别 现在我正在用C++编程一个类似于Cron的调度程序。我的程序能够在特定时间启动作业并正确安排它们。 给我留下麻烦的是检查流程是否仍然存在
所以我有一张地图;它以进程句柄作为键,以作业作为值填充。 我如何将这两种价值观联系起来?我陷入了这样的境地:每当我尝试GetExitCodeProcess时,它都不会返回到仍然处于活动状态。是否可以为流程设置唯一的令牌/密钥,以便我可以识别它并将其与作业关联起来 任何想法都会帮上大忙,谢谢启动流程并在以后进行识别 现在我正在用C++编程一个类似于Cron的调度程序。我的程序能够在特定时间启动作业并正确安排它们。 给我留下麻烦的是检查流程是否仍然存在,c++,multithreading,scheduling,C++,Multithreading,Scheduling,所以我有一张地图;它以进程句柄作为键,以作业作为值填充。 我如何将这两种价值观联系起来?我陷入了这样的境地:每当我尝试GetExitCodeProcess时,它都不会返回到仍然处于活动状态。是否可以为流程设置唯一的令牌/密钥,以便我可以识别它并将其与作业关联起来 任何想法都会帮上大忙,谢谢 void Cron::CheckRunningJobs() { DatNowObj Today; DWORD exitCode = 0; // now iterate through
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;
}
}
}
void Cron::CheckRunningJobs()
{
今天的DatNowObj;
DWORD exitCode=0;
//现在迭代执行的作业并检查它们的状态
for(MC_STL_PTR(MapPtr,JobMap))//MapPtr是我的映射的指针
{
DatStrNowObj Today;//给出实际日期
DWORD exitCode=0;
PROT()
它不会直接返回退出代码。有关详细信息,请阅读链接的用户6545984。您在这里似乎很困惑
GetExitCodeProcess()
返回一个BOOL
,指示函数是否成功,而不是进程是否成功。您试图使用常量与BOOL
进行比较,就像它是一个exitCode
。但它们是不兼容的类型。即使它们不是,我也不知道您为什么要反复调用函数
要获取退出代码,需要传入一个LPDWORD
指针来接收它。调用函数一次,将两个输出放入正确的变量中—一个返回值,一个输出参数—并相应地响应它们
所以,你至少需要改变这个
MapPtr->second.exitCode = GetExitCodeProcess(MapPtr->first, &exitCode);
差不多
BOOL result = GetExitCodeProcess(MapPtr->first, &MapPtr->second.exitCode);
或者在任何您想要存储所述代码的地方-然后更新所有比较以匹配,如果需要,还可以将比较添加到结果中。在从CreateProcess
获得的句柄上执行WaitForSingleObject
(在您的情况下,它似乎是MapPtr->first
).MapPtr->first是从CreateProcess存储的句柄。WaitForSingleObject不会阻止其他进程吗?我的意思是如果我有两个作业同时启动。它不会阻止其他进程,但会阻止你的进程(在你调用它的线程中)。因此,您可以在一个单独的线程中等待每个进程,或者使用一个专用线程等待,该线程调用所有“当前”句柄的WaitForMultipleObjects
。后者当然涉及一些跨线程通信,用于传递新进程的句柄,并通知进程中的其他一些代码/线程进程已完成。在您的回答中值得一提的是返回的BOOL
的作用:指示函数是否成功。+1@Majid D D.L.只要确保您了解GetExitCodeProcess
将在进程仍处于活动状态时立即返回。因此,您可以仅从输入时间,同时做其他事情,或采用WaitForSingleObject
或WaitForMultipleObjects
方法。您不想(意外地)编写“busylop”这将反复轮询仍在运行的进程的退出代码。非常感谢!这对我很有帮助。我有点看不见它,以为它会直接返回退出代码。@MajidD.L.不客气。如果这对您有帮助,请向上投票。如果它回答了您的问题,请使用勾号将其标记为答案。
BOOL result = GetExitCodeProcess(MapPtr->first, &MapPtr->second.exitCode);