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

最新文章

  1. JSon解析
  2. 解决:eclipse 非正常关闭,导致无法正常启动
  3. VS联调多个解决方案的项目
  4. smoke
  5. iOS (UIButton封装)仿糯米首页缩放“按钮”效果
  6. SharePoint2013 Excel导出好的代码
  7. android使用TextView实现跑马灯的效果(1)
  8. iOS开发之自定义弹出的键盘
  9. 云计算之路-阿里云上:博客web服务器轮番CPU 100%
  10. 【一天一道LeetCode】#41. First Missing Positive
  11. flask基础---第三篇
  12. 设计模式のAbstractFactory(虚拟工厂)----创建模式
  13. 剑指offer(17)层次遍历树
  14. Angular 2 to Angular 4 with Angular Material UI Components
  15. Deep Neural Networks for Object Detection(翻译)
  16. jQuery之CSS选择器的处理机制
  17. JavaScript中this 详解
  18. phar 反序列化学习
  19. Android实战技巧:如何在ScrollView中嵌套ListView
  20. android形状drawable

热门文章

  1. 第一次作业_ChenHong1998
  2. Observable详解
  3. Python基础学习---位运算符
  4. 搭建项目(Vue学习笔记一)
  5. C++面试笔记(3)
  6. Python_随机序列生成_白噪声
  7. iptables 添加raw提高服务器性能之路
  8. R语言 一套内容 从入门 到放弃
  9. PHP博大精深,入门容易,精通难,怎么才能真正学好PHP
  10. 炸金花游戏(3)--基于EV(期望收益)的简单AI模型