线程内定时器2

需求:

由于某种原因,需要根据管理员设定的时间定时关闭服务器上的COM+程序以及Windows Service程序。

任务:

任务就是做一个Windows Service,这个Service要有一个配置窗体(该窗体可通过HotKey呼出窗体或在服务启动时把配置窗体放到系统托盘中),用于管理员配置所要关闭的服务条目以及关闭时间。

关键点:

1.要设置允许服务与桌面进行交互

2.定时(不想用Timer)

3.关闭相关程序

定时功能刚才调试了一下,已经实现!

实现的方法就是在服务中创建一个线程,以管理员设置的Interval做为阻塞时间

步骤1:先创建线程

 

uses

  Classes,SyncObjs,Dialogs,SysUtils;

type

  TMonitorThread=class(TThread)

  private

    FPushInterval:    Integer;

    procedure LoadConfigFile();

    procedure Procfunc();

  protected

    procedure Execute; override;

  public

    property    PushInterval: Integer read FPushInterval write FPushInterval;

    constructor Create(CreateSuspended: Boolean);

    destructor  Destroy; override;

  end;

implementation





constructor TMonitorThread.Create(CreateSuspended: Boolean);

begin

  inherited;

  .....

end;



destructor TMonitorThread.Destroy;

begin

  .....

  inherited;

end;



procedure TMonitorThread.Execute;

begin

  

  

  case QuitEvent.WaitFor(10) of   

    wrSignaled, wrAbandoned: Terminate;

  end;



  while not Terminated do

  begin

   Procfunc;

    case QuitEvent.WaitFor(FPushInterval*1000) of

      wrSignaled, wrAbandoned: Terminate;

      wrTimeOut, wrError: ; // do nothing

    end;

  end;



end;



procedure TMonitorThread.LoadConfigFile;

begin

  .....

end;



procedure TMonitorThread.Procfunc;

begin

  .....

end;
View Code

步骤2:在服务OnStart和OnStop中创建事件,这个事件需要设置为可人工干预的

uses

  SyncObjs;



procedure TService.NotifyAllThreadsToQuit;

begin

  QuitEvent.SetEvent;//在服务

end;

 



procedure TService.OnStop;

begin

  NotifyAllThreadsToQuit;//在服务停止时,用事件的形式发一个Signal,这时如果Monitor线程收到后,会把线程的Terminite置为True,跳出循环

end;



initialization

  QuitEvent := TEvent.Create(nil,true,false,'ServiceQuitEvent');



finalization

  QuitEvent.Free;
View Code

 

你可能感兴趣的:(定时器)