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
  • 相关阅读:
    你必须会的 JDK 动态代理和 CGLIB 动态代理
    Dubbo 扩展点加载机制:从 Java SPI 到 Dubbo SPI
    volatile 手摸手带你解析
    Dubbo之服务消费原理
    Dubbo之服务暴露
    ElasticSearch之映射常用操作
    Redis5新特性Streams作消息队列
    .NET 开源项目 StreamJsonRpc 介绍[下篇]
    .NET 开源项目 StreamJsonRpc 介绍[中篇]
    .NET 开源项目 StreamJsonRpc 介绍 [上篇]
  • 原文地址:https://www.cnblogs.com/key-ok/p/3358909.html
Copyright © 2011-2022 走看看