1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. CheckBox1: TCheckBox;
  12. CheckBox2: TCheckBox;
  13. Button1: TButton;
  14. Button2: TButton;
  15. Memo1: TMemo;
  16. procedure FormCreate(Sender: TObject);
  17. procedure Button1Click(Sender: TObject);
  18. procedure Button2Click(Sender: TObject);
  19. private
  20. { Private declarations }
  21. public
  22. { Public declarations }
  23. end;
  24.  
  25. var
  26. Form1: TForm1;
  27.  
  28. implementation
  29.  
  30. {$R *.dfm}
  31. procedure Log(Msg: string);
  32. begin
  33. TThread.Synchronize(nil, procedure
  34. begin
  35. Form1.Memo1.Lines.Add(Msg);
  36. end);
  37. end;
  38.  
  39. procedure TForm1.Button1Click(Sender: TObject);
  40. begin
  41. if System.MonitorTryEnter(Self) then //如果为 True
  42. begin
  43. Color := clRed;
  44. System.MonitorExit(Self); //也必须退出,否则 System.MonitorPulse(Self); 失效。
  45. end;
  46. end;
  47.  
  48. procedure TForm1.Button2Click(Sender: TObject);
  49. begin
  50. System.MonitorPulse(Self);
  51. end;
  52.  
  53. procedure TForm1.FormCreate(Sender: TObject);
  54. begin
  55. TThread.CreateAnonymousThread(procedure
  56. begin
  57. while True do
  58. begin
  59. if Form1.CheckBox2.Checked then
  60. Exit;
  61.  
  62. System.MonitorEnter(Form1); //必须
  63. Log('Thread1 Enter');
  64. System.MonitorWait(Form1, INFINITE);
  65. Log('Thread1 WaitFor');
  66. System.MonitorExit(Form1); //必须
  67. Log('Thread1 Exit');
  68.  
  69. Log(DateTimeToStr(Now));
  70. TThread.Sleep();
  71. end;
  72. Log('Thread Exit');
  73. end).Start;
  74. end;
  75.  
  76. end.
  77.  
  78. 注意事项:
      if System.MonitorTryEnter(Self) then  //如果为 True
      begin
        Color := clRed;
        System.MonitorExit(Self);    //也必须退出(释放),否则 System.MonitorPulse(Self); 失效。
      end;
  1. System.MonitorTryEnter System.MonitorEnter 的区别在于是否会 block 当前调用 System.MonitorEnter System.MonitorTryEnter 的线程。
  2.  
  3. System.MonitorEnter block 调用线程
    System.MonitorTryEnter 不会 block 调用线程。
  4.  
  5. 此外
  1. System.MonitorEnter(Form1);
  2. System.MonitorWait(Form1, INFINITE); //执行后, Button1的onclick事件中,System.MonitorTryEnter(Self) 总会返回 True

delphi 多线程之System.TMonitor (续一)的更多相关文章

  1. delphi 多线程之System.TMonitor

    三天不写代码就手生! 把测试代码记录下来. unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, S ...

  2. 【C#】线程之Parallel

    在一些常见的编程情形中,使用任务也许能提升性能.为了简化变成,静态类System.Threading.Tasks.Parallel封装了这些常见的情形,它内部使用Task对象. Parallel.Fo ...

  3. 多线程之join方法

    join方法的功能就是使异步执行的线程变成同步执行.也就是说,当调用线程实例的start方法后,这个方法会立即返回,如果在调用start方法后后需要使用一个由这个线程计算得到的值,就必须使用join方 ...

  4. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  5. JAVA多线程之volatile 与 synchronized 的比较

    一,volatile关键字的可见性 要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下: 从图中可以看出: ①每个线程都有一个自己的本地内存空间--线程栈空 ...

  6. java多线程之yield,join,wait,sleep的区别

    Java多线程之yield,join,wait,sleep的区别 Java多线程中,经常会遇到yield,join,wait和sleep方法.容易混淆他们的功能及作用.自己仔细研究了下,他们主要的区别 ...

  7. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  8. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

  9. Android 多线程之IntentService 完全详解

    关联文章: Android 多线程之HandlerThread 完全详解 Android 多线程之IntentService 完全详解 android多线程-AsyncTask之工作原理深入解析(上) ...

随机推荐

  1. HTML5 classList使用

       add:给元素添加一个指定的class var test = document.getElementById('test'); test.classList.add('yellow');//添加 ...

  2. Django中STATIC_URL、STATIC_ROOT、STATICFILES_DIRS 的区别关系

    首先,我们配置静态文件,要在setting.py里面加入如下几行代码: settings.py # the settings above # STATIC SETTINGS STATIC_URL = ...

  3. zabbix添加IIS网站计数器(并发连接数)详解

    环境:windows server 2012 前提:IIS上要添加好配置   1,在被监控主机,powershell输入perfmon.msc   2,点击添加按钮     3,在下拉菜单中点击小箭头 ...

  4. protel dxp 2004安装与破解

    安装准备 压缩文件包内容: dxp2004汉化补丁 dxp2004元件库 Network License Setup网络版注册机 Protel DXP2004原程序 Protel2004_sp2_单机 ...

  5. Sonar 平台搭建及 Sonar 自定义规则打包部署篇

    引言 基于阿里开发手册的sonar自定义插件工程 开源地址: https://github.com/tigerge000/sonar-java-custom-rules.git由于最近来问童鞋,就算写 ...

  6. shell if判断写成一行

    [[ $? -eq 0 ]] && echo "backup $i success" || exit #判断上一个命令是否执行正确,退出状态吗如果为0,则执行ech ...

  7. 3D数学基础(四)四元数和欧拉角

    一.四元数 四元数本质上是个高阶复数,可视为复数的扩展,表达式为y=a+bi+cj+dk.在说矩阵旋转的时候提到了它,当然四元数在Unity里面主要作用也在于此.在Unity编辑器中的Transfor ...

  8. Classnotfoundexception 与 noClassDelfaultError的区别

    ClassNotFoundException 这个异常特别常见,就是class找不到异常,一般的问题就是: 1 调用class的forName方法时,找不到指定的类 2 ClassLoader 中的 ...

  9. canvas绘制随机验证码

    效果图: 思路: 1, 绘制canvas画布,进行基础设置 2.绘制一个矩形 3.设置验证码的随机数 4.设置验证码随机数的随机颜色 5.绘制随机干扰线 6,绘制随机干扰点 经过以上六个步骤,验证码的 ...

  10. Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发WebFlux 支持两种编程风(姿)格(势) 使用@Controller这种基于注解

    概述 什么是 Spring WebFlux, 它是一种异步的, 非阻塞的, 支持背压(Back pressure)机制的Web 开发框架. 要深入了解 Spring WebFlux, 首先要了知道 R ...