线程内定时器2

时间:2021-01-27 00:10:54

需求:

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

任务:

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

关键点:

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

2.定时(不想用Timer)

3.关闭相关程序

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

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

步骤1:先创建线程

 

线程内定时器2线程内定时器2
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中创建事件,这个事件需要设置为可人工干预的

线程内定时器2线程内定时器2
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