• 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)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Memo1: TMemo;
        CheckBox1: TCheckBox;
        CheckBox2: TCheckBox;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        FFlag: Boolean;
      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(Form1) then
      begin
        System.MonitorEnter(Form1);
        System.MonitorPulseAll(Form1);
        System.MonitorExit(Form1);
      end
      else
        Log('????');
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      //正确
      System.MonitorPulseAll(Form1);
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      AThread: TThread;
    begin
      FFlag := True;
      TThread.CreateAnonymousThread(procedure
        begin
          while True do
          begin
            if Form1.CheckBox2.Checked then
              Exit;
    
            if Form1.FFlag then
            begin
                System.MonitorEnter(Form1);  //必须
                Log('Thread1 Enter');
                System.MonitorWait(Form1, INFINITE);
                Log('Thread1 WaitFor');
                System.MonitorExit(Form1);   //必须
                Log('Thread1 Exit');
            end;
    
            Log(DateTimeToStr(Now));
            TThread.Sleep(100);
          end;
          Log('Thread Exit');
        end).Start;
    
      TThread.CreateAnonymousThread(procedure
        begin
          while True do
          begin
            if Form1.CheckBox2.Checked then
              Exit;
    
            if Form1.FFlag then
            begin
                System.MonitorEnter(Form1);
                Log('Thread2 Enter');
                System.MonitorWait(Form1, INFINITE);
                Log('Thread2 WaitFor');
                System.MonitorExit(Form1);
                Log('Thread2 Exit');
            end;
    
            Log(DateTimeToStr(Now));
            TThread.Sleep(100);
          end;
          Log('Thread Exit');
        end).Start;
    end;
    
    end.

    注意事项:

    1. 三个方法必须一块使用,不能只写 System.MonitorWait(Form1, INFINITE);

                System.MonitorEnter(Form1);  //必须
                Log('Thread1 Enter');
                System.MonitorWait(Form1, INFINITE);
                Log('Thread1 WaitFor');
                System.MonitorExit(Form1);   //必须
                Log('Thread1 Exit');

    2.  System.MonitorPulseAll(Form1) 即可。不要这样写

        System.MonitorEnter(Form1);
        System.MonitorPulseAll(Form1);
        System.MonitorExit(Form1);

  • 相关阅读:
    buildroot编译文件系统,出现mount: you must be root. can't open /dev/console: Permission denied这种错误。
    Ubuntu 18.04实现实时显示网速
    git 第一次push 出现fatal: 无法读取远程仓库。
    Sql2012 AlwaysOn
    SCVMM 安装
    POJ 3537 Crosses and Crosses
    HDOJ 1524 A Chess Game
    HDOJ 1907 John
    HDOJ 1848 Fibonacci again and again
    HDOJ 1536 S-Nim
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/7467882.html
Copyright © 2020-2023  润新知