Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455335
  • 博文数量: 724
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

2008-10-13 16:56:59

Process是.NET Framework提供给我们用于进程管理的一个类,并以组件的形式放在了VC#.NET IDE的工具箱中。下面以实际的代码演示如何实现父进程等待子进程退出的功能(代码已做大量简化)


//在构造子中初始化Process对象与IsLoaded
Process processSub = new Process();
bool IsLoaded = false;

public bool LoadSubProcess()
 {
  //使用非静态的Start(),才能建立进程间的父子关系
  processSub.StartInfo.FileName = PLocation;

  //设置进程结束时的回调方法,this是父进程的窗口对象
  processSub.SynchronizingObject = this;
  processSub.Exited += new EventHandler(ExitHandler);
  processSub.EnableRaisingEvents = true;

  processSub.Start();  

  //子进程已被装载标志
  IsLoaded = true;
  
  return true;  
 }
 
//当进程结束时,会回调这个方法,此时置IsLoaded为false
private void ExitHandler(object sender, System.EventArgs e)
 {
  processSub.Close();
  IsLoaded = false;   
 }
 
//在主进程窗口类的Application.Idle事件中检查子进程是否已经关闭 
private void MainForm_Idle(object sender, System.EventArgs e)
 {
  //当然判断条件不可能如此简单,否则IsLoaded在对象构造时为false
  if (!IsLoaded))
   {
   //这里加上子进程退出后父进程想要做的事
   ;
   }
  return;
 }


2007-3-20修订

考虑到上述实现方式中,子线程对象需要保存一个对父线程对应的Form对象的引用,而且需要添加一个IsLoaded标志进行判断,略显累赘,所以在回顾了《》一文的方法后,参考文中的实现方式,将上例改为:

1. 利用主线程的BeginInvoke()以异步方式调用启动子线程的方法,即本例中的LoadSubProcess(),并为之设置一个回调方法Callback();

2. 在LoadSubProcess()内部,不再设置其回调方法,而是利用Process.WaitForExit()进入无限循环等待,等Process对应的进程结束后,在WaitForExit()之后紧接调用Process.Close();

3. 当子线程结束后,Callback()被调用,我们接着在Callback()中去做其余类似更新界面等工作。

这样的方式,比我原来采用的方式更符合语境逻辑,适合在分层的系统中使用。

posted on 2004-08-22 10:25 Abbey的小匣子 阅读(1217)   


--------------------next---------------------

阅读(984) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~