启动和等待进程结束 |
我们在开发是经常需要在启动一个进程之后等待其结束后再继续运行。 在这里提供了一个名为Wait的函数,它会为你完成上面的功能。实现的思想是在启动进程后等待其结束,由于进程是一种资源,而资源的句柄在WIN32中可以作为核心量使用。你可以使用WaitForSingleObject等待核心量状态改变为有信号状态。对进程来讲当进程结束时其状态转变为有信号。 在本例中使用了一个单独的线程来启动进程并等待结束。 Wait() BOOL Wait(CString szCmdLine) { LPTHREADINFO pThreadInfo = new THREADINFO; CEvent *pThreadEvent = new CEvent(FALSE, TRUE); ASSERT_VALID(pThreadEvent); if(pThreadInfo) { pThreadInfo->pTermThreadEvent = pThreadEvent; pThreadInfo->strPathName = szCmdLine; AfxBeginThread(LaunchAndWait, pThreadInfo); WaitForSingleObject(pThreadEvent->m_hObject, INFINITE); return TRUE; } return FALSE; } LaunchAndWait() UINT LaunchAndWait(LPVOID pParam) { LPTHREADINFO pThreadInfo = (LPTHREADINFO) pParam; PROCESS_INFORMATION stProcessInfo; if(LaunchApplication(pThreadInfo->strPathName, &stProcessInfo)) { HANDLE hThreads[2]; hThreads[0] = pThreadInfo->pTermThreadEvent->m_hObject; hThreads[1] = stProcessInfo.hProcess; DWORD dwIndex = WaitForMultipleObjects(2, hThreads, FALSE, INFINITE); CloseHandle(stProcessInfo.hThread); CloseHandle(stProcessInfo.hProcess); pThreadInfo->pTermThreadEvent->SetEvent(); if(pThreadInfo) delete pThreadInfo; } else pThreadInfo->pTermThreadEvent->SetEvent(); return 0; } LaunchApplication() BOOL LaunchApplication(LPCTSTR pCmdLine, PROCESS_INFORMATION *pProcessInfo) { STARTUPINFO stStartUpInfo; memset(&stStartUpInfo, 0, sizeof(STARTUPINFO)); stStartUpInfo.cb = sizeof(STARTUPINFO); stStartUpInfo.dwFlags = STARTF_USESHOWWINDOW; stStartUpInfo.wShowWindow = SW_SHOWDEFAULT; return CreateProcess(NULL, (LPTSTR)pCmdLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &stStartUpInfo, pProcessInfo); } |