There can be no Triumph without Loss,No Victory without Suffering,No Freedom without Sacrifice.
All you have to decide is what to do with the time that is given to you.
Get busy Living, or Get busy Dying?
  首页 | 留言给我 | 订阅 Rss | CLI | 黄白之恋 Posts:158   Hits: 5058886    Comments: 173    
 日历归档
<<  <  2024 - 04  >  >>
SuMoTuWeThFrSa
 123456
78910111213
14151617181920
21222324252627
282930
 About Me
 Name: ZhangSichu
 Sex: Male
 Age: 32
 Email: ZhangSichu@gmail.com
 MSN: ZhangSichu@hotmail.com
 Home: ZhangSichu.com
 WeiBo: weibo.com/zhangsichu
 个人推荐
 分类归档
  ·C++/C(5)  RSS
  ·软件工程(1)  RSS
  ·杂事/随感(26)  RSS
  ·.Net/Java(30)  RSS
  ·面向对象程序设计(5)  RSS
  ·汇编/破解(0)  RSS
  ·平面设计(3)  RSS
  ·SQL(5)  RSS
  ·COM/COM+(2)  RSS
  ·Web开发(81)  RSS
 My Friends
Back Forward Refresh Home 2024年4月19日 星期五 RSS CLI Mine Sweeper. In Javascript.

  Periodic Checker
字体大小 [ ]

Periodic Checker – 周期性检查器。 什么是周期性检查器? 就是间隔一个预先设定的时间,就去检查某个特定的程序是否正常运行,如果没有正常运行就重新启动那个被监视的程序。听起来好像很奇怪,监视一个程序,重新启动那个被监视的程序?那看看下面的简明的流程图吧。 :)

流程如下图:
Click to Open in New Window

其实也是在一个很偶然的机会下,我想到了这个程序。有一次我发现某些不知道是干什么的程序,在系统任务管理栏中出现(我猜想可能是木马或者什么别的程序),结束这些程序的进程后,过了一会又出现了。我就猜想在这些程序后面,是不是还有一个程序负责在它们的进程被结束后,再次启动它们。我沿着这个想法就写了这个 Periodic Checker。
Period Checker 主要有下买几个部分:
1.ApplicationProcess
  ProcessException
  ProcessStatusEventArgs
  ProcessStatusEventArgs

  ApplicationProcess 是一个应用程序包装器,它包装一个应用程序,它为PeriodicChecker提供这个应用程序的运行状态,为PeriodicChecker提供CheckAlive() ShutdownProcess() StartupProcess() 这些方法,可以让PeriodicChecker 方便的监视和控制这个应用程序。

2.PeriodicChecker
  PeriodicChecker 周期的检查被监视的应用程序,PeriodicChecker内部有一个Timer, 间隔设定的时间后检查被监视的应用程序是否出问题,当Crash时抛出ProcessCrashedEvent事件。PeriodicChecker向外提供了Start() Stop() 这些方法,让PeriodicChecker 开始或停止对指定的应用程序进行监控。

3.LoadApplication
  LoadApplication 站在最外面,它向最外面提供方法,它像一个组合器,加载一个应用程序,处理PeriodicChecker 抛出的ProcessCrashedEvent事件,使PeriodicChecker完整的运行起来。

下面来分析一下整个程序的流程吧
首先在声明一个LoadApplication的时候,会指定一个具体的Application,启动时的参数,间隔多少毫秒进行一次检查。如:new LoadApplication("PeriodicApplication.exe","",false,5000), 当new LoadApplication后,会初始化ApplicationProcess PeriodicChecker:
      this._checkPeriod = checkPeriod;
      this._applicationProcess = new ApplicationProcess(applicationName,applicationArgs,withPath);
      this._periodicChecker = new PeriodicChecker(this._applicationProcess);
      this._applicationProcess.ProcessStatusChangedEvent += new ApplicationProcess.ProcessStatusEventHandler(_applicationProcess_ProcessStatusChangedEvent);
      this._periodicChecker.ProcessCrashedEvent += new PeriodicChecker.ProcessStatusEventHandler(_periodicChecker_ProcessCrashedEvent);
      this._applicationProcess.StartupProcess();

处理ProcessCrashedEvent事件:
      ApplicationProcess applicationProcess = (ApplicationProcess)((PeriodicChecker)sender).CheckedApplication;
      applicationProcess.Dispose();
      applicationProcess.StartupProcess();

当PeriodicChecker发现有ProcessStatusChangedEvent会在ApplicationProcess Alive时启动PeriodicChecker, 非Alive时Stop PeriodicChecker
if(this._periodicChecker != null)
{
  if(e.Alive)
  {
    //Check the application.
    this._periodicChecker.Start(this._checkPeriod);
  }
  else
  {
    this._periodicChecker.Stop();
  }
}
  PeriodicChecker ApplicationProcess这两个类负责下面的一切处理。
  ApplicationProcess 通过Application的ProcessID来监控当前的这个应用程序是否在运行,主要通过调用System.Diagnostics.Process.Start System.Diagnostics.Process.Kill System.Diagnostics.Process.GetProcessById 这些方法来控制程序的运行。
  PeriodicChecker 提供Start Stop方法使PeriodicCheck开始或者停止对应用程序的监控。并在应用程序Crash的时候,抛出ProcessCrashedEvent事件。
  最后在LoadApplication中完成全局的控制。

File: Click to Download
  Posted @ 3/18/2006 11:58:42 AM | Hits (75625) | Comment (0

  Post Comment
标题 *
作者 *
密码 记住我
评论 *
    


Stable in Firefox 1.5 2.0Stable in IE6 IE7Stable in MozillaStable in Netscape
ZhangSichu.com V0.1.7507
Powered By ZhangSichu
Copyright © ZhangSichu
Download ZhangSichu.com source code. Download source code