VC++中进程与多进程管理的实现方法(2)
  // 临时变量 
  CString sCommandLine; 
  char cWindowsDirectory[MAX_PATH]; 
  char cCommandLine[MAX_PATH]; 
  DWORD dwExitCode; 
  PROCESS_INFORMATION pi; 
  STARTUPINFO si = {sizeof(si)}; 
  // 得到Windows目录 
  GetWindowsDirectory(cWindowsDirectory, MAX_PATH); 
  // 启动"记事本"程序的命令行 
  sCommandLine = CString(cWindowsDirectory) + "NotePad.exe"; 
  ::strcpy(cCommandLine, sCommandLine); 
  // 启动"记事本"作为子进程 
  BOOL ret = CreateProcess(NULL, cCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); 
  if (ret) { 
  // 关闭子进程的主线程句柄 
  CloseHandle(pi.hThread); 
  // 等待子进程的退出 
  WaitForSingleObject(pi.hProcess, INFINITE); 
  // 获取子进程的退出码 
  GetExitCodeProcess(pi.hProcess, &dwExitCode); 
  // 关闭子进程句柄 
  CloseHandle(pi.hProcess); 
  } 
此段代码首先通过CreateProcess()创建Windows自带的“记事本”程序为子进程,子进程启动后父进程通过WaitForSingleObject()函数等待其执行的结束,在子进程没有退出前父进程是一直处于阻塞状态的,这里子进程的作用同单线程中的函数类似。一旦子进程退出,WaitForSingleObject()函数所等待的pi.hProcess对象将得到通知,父进程将得以继续,如有必要可以通过GetExitCodeProcess()来获取子进程的退出代码。
相比而言,更多的情况是父进程在启动完子进程后就再不与其进行任何数据交换和通讯,由其创建的子进程的执行成功与否均与父进程无关。许多大型软件在设计时也多采用了这类思想,将某些功能完全通过独立的应用程序来完成,当需要执行某操作时只要通过主程序启动相应的子进程即可,具体的处理工作均由子进程去完成。这类子进程的创建过程更为简单,例如对于上面那段代码只需去除对子进程句柄pi.hProcess的等待即可:
  BOOL ret = CreateProcess(NULL, cCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); 
  if (ret) { 
  // 关闭子进程的主线程句柄 
  CloseHandle(pi.hThread); 
  // 关闭子进程句柄 
  CloseHandle(pi.hProcess); 
  } 
可以通过dwCreationFlags参数在创建进程时设置子进程的优先级。前面的示例代码在创建子进程时使用的均是默认的优先级,如果要将优先级设置为高,可以修改如下:
BOOL ret = CreateProcess(NULL, cCommandLine, NULL, NULL, FALSE, HIGH_PRIORITY_CLASS, NULL, NULL, &si, &pi);
- 上一篇:VC实现程序重新启动
- 下一篇:VC++ 的串口通讯

