zoukankan      html  css  js  c++  java
  • 线程内定时器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
  • 相关阅读:
    【集合】元组元素命名
    普通数组-队列
    稀疏数组
    Java基础 07 API概述 Scanner类 Random类 ArrayList类
    Java基础 06 类与对象、封装、构造方法
    Java基础 05 数组
    Java基础 04 IDEA、方法
    Java基础 04 [附] IDEA 的安装、配置与使用
    Java基础 03 流程控制语句
    Java基础 02 数据类型转换、运算符、方法入门
  • 原文地址:https://www.cnblogs.com/key-ok/p/3358909.html
Copyright © 2011-2022 走看看