启动流程并在以后进行识别 现在我正在用C++编程一个类似于Cron的调度程序。我的程序能够在特定时间启动作业并正确安排它们。 给我留下麻烦的是检查流程是否仍然存在

启动流程并在以后进行识别 现在我正在用C++编程一个类似于Cron的调度程序。我的程序能够在特定时间启动作业并正确安排它们。 给我留下麻烦的是检查流程是否仍然存在,c++,multithreading,scheduling,C++,Multithreading,Scheduling,所以我有一张地图;它以进程句柄作为键,以作业作为值填充。 我如何将这两种价值观联系起来?我陷入了这样的境地:每当我尝试GetExitCodeProcess时,它都不会返回到仍然处于活动状态。是否可以为流程设置唯一的令牌/密钥,以便我可以识别它并将其与作业关联起来 任何想法都会帮上大忙,谢谢 void Cron::CheckRunningJobs() { DatNowObj Today; DWORD exitCode = 0; // now iterate through

所以我有一张地图;它以进程句柄作为键,以作业作为值填充。 我如何将这两种价值观联系起来?我陷入了这样的境地:每当我尝试GetExitCodeProcess时,它都不会返回到仍然处于活动状态。是否可以为流程设置唯一的令牌/密钥,以便我可以识别它并将其与作业关联起来

任何想法都会帮上大忙,谢谢

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);