zoukankan      html  css  js  c++  java
  • delphi 多线程之 TEvent 和 TLightweightEvent

    unit Unit1;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,  system.SyncObjs;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Memo1: TMemo;
        CheckBox1: TCheckBox;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure CheckBox1Click(Sender: TObject);
      private
      public
        { Public declarations }
      end;
    
      TMyThread = class(TThread)
      protected
        procedure Execute; override;
      end;
    
    var
      Form1: TForm1;
      AEvent: TEvent;
      MyThread: TMyThread;
    
    implementation
    
    {$R *.dfm}
    
    procedure Log(Msg: string);
    begin
      TThread.Synchronize(nil, procedure begin
        Form1.Memo1.Lines.Add(Msg);
      end);
    end;
    
    { TMyThread }
    
    procedure TMyThread.Execute;
    begin
      while not Terminated do
      begin
        AEvent.Acquire;
        Log(DateTimeToStr(Now));
        TThread.Sleep(500);
      end;
      Log('Exit');
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      AEvent.SetEvent;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      AEvent.ResetEvent;
    end;
    
    procedure TForm1.CheckBox1Click(Sender: TObject);
    begin
      MyThread.Terminate;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Memo1.Clear;
      AEvent := TEvent.Create(nil, False, False, '');
      MyThread := TMyThread.Create(False);
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      if not MyThread.Finished then
      begin
        //确保线程正常退出
        MyThread.Terminate;
        AEvent.SetEvent;
        MyThread.WaitFor;
      end;
      MyThread.Free;
    
      AEvent.Free;
    end;
    
    end.
    AEvent := TEvent.Create(nil, False, False, '');

    第一个False, 线程是否可以执行一次. 如何为True,相当于 do while, 如果为 False , 相当于 while .
    第二个False, 相当于线程是否可以直接运行,不需要SetEvent. 如果为 True , 则必须调用 SetEvent 后,线程才能运行。也就是线程启动后就被阻塞住。
    当两个同时为 False 时, 就可以实现类似 PulseOneEvent 的功能。



    TLightweightEvent 和 TEvent 基本上是一样的,它是从 .NET中的 System.Threading.ManualResetEventSlim 学来的。对于多核,短时间间隔效率更好,可参考 MSDN 。

  • 相关阅读:
    SSL JudgeOnline 1194——最佳乘车
    SSL JudgeOnline 1457——翻币问题
    SSL JudgeOnlie 2324——细胞问题
    SSL JudgeOnline 1456——骑士旅行
    SSL JudgeOnline 1455——电子老鼠闯迷宫
    SSL JudgeOnline 2253——新型计算器
    SSL JudgeOnline 1198——求逆序对数
    SSL JudgeOnline 1099——USACO 1.4 母亲的牛奶
    SSL JudgeOnline 1668——小车载人问题
    SSL JudgeOnline 1089——USACO 1.2 方块转换
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/7496836.html
Copyright © 2011-2022 走看看