我怎样才能产生一个只能持续一段时间的过程

时间:2013-12-27 10:17:46

标签: c++ multithreading process createprocess

我有一个父进程,我想将子进程生成一段时间(比如N毫秒)。我在c ++(和windows)中这样做。

我可以向CreateProcess提供一些参数,这些参数会在一段时间后将其终止并将控制权返回给父应用程序吗?如果没有,还有其他办法吗?

2 个答案:

答案 0 :(得分:1)

我可以为CreateProcess提供一些参数......?

是的,您可以将所需的duration(N)参数 lpCommandLine 传递给要启动的进程。

子进程可以解析 lpCommandLine 并设置一个带有所需的计时器 duration。例如,该计时器可以是Waitable Timer或仅仅是具有

的线程
Sleep(duration);               // waits the duration
ExitProcess(GetLastError());   // exits the "remote" process

线程(子进程内的线程)在duration之后终止整个子进程。 WaitableTimer的想法需要频繁调用wait函数。有关详细信息,请参阅Using Waitable Timer Objects

但是:父流程始终处于“控制中”状态。 但是:您可以另外 在父进程中进入等待状态,使用等待函数(例如WaitForSingleObject),等待子进程句柄实际休眠父进程,直到子进程终止。最后,您可以评估子进程的返回值通过调用GetExitCodeProcess function进行处理。

所描述的方案确保最佳执行所需的duration,但是,您也可以通过命名事件控制父进程中的duration。有关详细信息,请参阅Using Event Objects。在这种方法中,父进程可以在消耗duration“时设置事件。子进程等待该事件,并在设置事件时终止。这种方法可能不太准确,因为父母不太清楚孩子duration何时开始。

等待计时器的示例:

家长流程:

...
#define CHILD_DURATION 2000  // 2000 ms    

HANDLE hProcess;
char ChildName[MAX_PATH];
char CommandLine[MAX_PATH];

sprintf_s(ChildName,MAX_PATH,"MyChild.exe");
sprintf_s(CommandLine,MAX_PATH,"%d",CHILD_DURATION);

// start the child 
hProcess = CreateProcess(ChildProcessName,CommandLine,....
if (0 == hProcess)
{
  // error with process creation
  printf("CreateProcessfailed (%d)\n", GetLastError());
  return GetLastError();
}

// and wait for it to finish
if (WAIT_OBJECT_0 == WaitForSingleObject(hProcess,INFINITE) 
{
  // child finished
} else
{
  // error with wait
  printf("WaitForSingleObject failed (%d)\n", GetLastError());
  return GetLastError();
}  
...

子进程:

int main(int argc, char * argv[])
{

    HANDLE hWaitableTimer CreateWaitableTimer(NULL,TRUE,NULL);
    if (NULL == hWaitableTimer)
    {
        printf("CreateWaitableTimer failed (%d)\n", GetLastError());
        return GetLastError();
    }

    DWORD dwDuration = atoi(argv[1]);
    LARGE_INTEGER liDueTime = -10000 * dwDuration; 
    // waitable timer due time is in 100 nano second units
    // negative values indicate relative time
    if (!SetWaitableTimer(hTimer, &liDueTime, 0, NULL, NULL, 0))
    {
        printf("SetWaitableTimer failed (%d)\n", GetLastError());
        return GetLastError();
    }

    DWORD dwKeepGoing = TRUE;
    // enter the "to do" loop while waiting for the timer...
    While (dwKeepGoing) 
    {
        switch (WaitForSingleObject(hTimer,0) 
        {
            case WAIT_OBJECT_0:
                // duration over, 
                // optionally finalize "to do" stuff here 
                // and end child
                dwKeepGoing = FALSE;

            case WAIT_TIMEOUT:
                // do stuff here
                break;

            case WAIT_FAILED:
                // the wait function has failed                     
                printf("WaitForSingleObject failed (%d)\n", GetLastError());
                return GetLastError();
        }
     }
     return 0;
}

答案 1 :(得分:1)

没有人会为你杀死这个过程,除非你自己做(例如从父进程),或者进程退出。

请注意,也没有“并将控制权返回给父应用程序”。一旦子进程启动,父进程和子进程都有自己的“控制”并同时运行,消耗操作系统给进程的CPU时间。

总而言之,您决定谁将终止该过程。如果你是从父进程执行的,那么一旦启动你就会保留子进程句柄并使用(虽然不是一个好主意)TerminateProcess API用于子进程。

否则,这是更好的一个,子进程本身一直在查看运行时,只是在它的时候退出:

main() {
  time_to_exit = now() + N;
  while(now() < time_to_exit) {
    keep_doing_my_stuff();
  }
}