zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    Ubuntu 12.10下为Firefox安装Adobe Flash Player
    oracle同时操作两个实例,如何进行切换操作?
    Ubuntu 12.10下为Firefox安装Adobe Flash Player
    Ubuntu11.10 安装oracle 11g
    oracle忘记system和sys账户的密码怎么办?
    linux 搭建java开发环境
    Oracle 笔记 day04
    节约网络带宽的设计策略
    集群化服务器
    01 基础概念(实战Linux Shell编程与服务器管理)
  • 原文地址:https://www.cnblogs.com/Jiaojiawang/p/7467882.html
Copyright © 2011-2022 走看看