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();
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
上一篇:十、Linux 自动化脚本与函数


下一篇:linux系统优化(关闭SElinux、防火墙)