• delphi 多线程之System.TMonitor (续一)


    unit Unit1;
    
    interface
    
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
    
    type
      TForm1 = class(TForm)
        CheckBox1: TCheckBox;
        CheckBox2: TCheckBox;
        Button1: TButton;
        Button2: TButton;
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    procedure Log(Msg: string);
    begin
      TThread.Synchronize(nil, procedure
        begin
          Form1.Memo1.Lines.Add(Msg);
        end);
    end;
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if System.MonitorTryEnter(Self) then  //如果为 True
      begin
        Color := clRed;
        System.MonitorExit(Self);    //也必须退出,否则 System.MonitorPulse(Self); 失效。
      end;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      System.MonitorPulse(Self);
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      TThread.CreateAnonymousThread(procedure
        begin
          while True do
          begin
            if Form1.CheckBox2.Checked then
              Exit;
    
            System.MonitorEnter(Form1);  //必须
            Log('Thread1 Enter');
            System.MonitorWait(Form1, INFINITE);
            Log('Thread1 WaitFor');
            System.MonitorExit(Form1);   //必须
            Log('Thread1 Exit');
    
            Log(DateTimeToStr(Now));
            TThread.Sleep(100);
          end;
          Log('Thread Exit');
        end).Start;
    end;
    
    end.

    注意事项:
      if System.MonitorTryEnter(Self) then  //如果为 True
      begin
        Color := clRed;
        System.MonitorExit(Self);    //也必须退出(释放),否则 System.MonitorPulse(Self); 失效。
      end;
    System.MonitorTryEnter 与 System.MonitorEnter 的区别在于是否会 block 当前调用 System.MonitorEnter 或 System.MonitorTryEnter 的线程。

    System.MonitorEnter 会 block 调用线程
    System.MonitorTryEnter 不会 block 调用线程。

    此外
            System.MonitorEnter(Form1);  
            System.MonitorWait(Form1, INFINITE);  //执行后, Button1的onclick事件中,System.MonitorTryEnter(Self) 总会返回 True 
  • 相关阅读:
    kafka 0.8.x producer Example(scala)
    Google V8扩展利器发布:v8-native-binding-generator
    beyond compare秘钥被禁
    STL算法之find
    十条nmap常用的扫描命令
    cgdb UTF-8乱码
    OpenWrt笔记
    openwrt hotplug
    git常用操作
    c99标准的restrict关键字
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/7468197.html
Copyright © 2020-2023  润新知