delphi 多线程之System.TMonitor

2017-09-03 10:10:19来源:cnblogs.com作者:jjw人点击

分享
第七城市th7cn

三天不写代码就手生! 把测试代码记录下来。

unit Unit1;interfaceuses  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);

第七城市th7cn

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台