需求:
由于某种原因,需要根据管理员设定的时间定时关闭服务器上的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;
步骤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;