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

  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. Button1: TButton;
  12. Button2: TButton;
  13. Button3: TButton;
  14. Button4: TButton;
  15. Memo1: TMemo;
  16. CheckBox1: TCheckBox;
  17. CheckBox2: TCheckBox;
  18. procedure FormCreate(Sender: TObject);
  19. procedure Button1Click(Sender: TObject);
  20. procedure Button2Click(Sender: TObject);
  21. private
  22. FFlag: Boolean;
  23. public
  24. { Public declarations }
  25. end;
  26.  
  27. var
  28. Form1: TForm1;
  29.  
  30. implementation
  31.  
  32. {$R *.dfm}
  33.  
  34. procedure Log(Msg: string);
  35. begin
  36. TThread.Synchronize(nil, procedure
  37. begin
  38. Form1.Memo1.Lines.Add(Msg);
  39. end);
  40. end;
  41.  
  42. procedure TForm1.Button1Click(Sender: TObject);
  43. begin
  44. //错误
  45. if System.MonitorTryEnter(Form1) then
  46. begin
  47. System.MonitorEnter(Form1);
  48. System.MonitorPulseAll(Form1);
  49. System.MonitorExit(Form1);
  50. end
  51. else
  52. Log('????');
  53. end;
  54.  
  55. procedure TForm1.Button2Click(Sender: TObject);
  56. begin
  57. //正确
  58. System.MonitorPulseAll(Form1);
  59. end;
  60.  
  61. procedure TForm1.FormCreate(Sender: TObject);
  62. var
  63. AThread: TThread;
  64. begin
  65. FFlag := True;
  66. TThread.CreateAnonymousThread(procedure
  67. begin
  68. while True do
  69. begin
  70. if Form1.CheckBox2.Checked then
  71. Exit;
  72.  
  73. if Form1.FFlag then
  74. begin
  75. System.MonitorEnter(Form1); //必须
  76. Log('Thread1 Enter');
  77. System.MonitorWait(Form1, INFINITE);
  78. Log('Thread1 WaitFor');
  79. System.MonitorExit(Form1); //必须
  80. Log('Thread1 Exit');
  81. end;
  82.  
  83. Log(DateTimeToStr(Now));
  84. TThread.Sleep();
  85. end;
  86. Log('Thread Exit');
  87. end).Start;
  88.  
  89. TThread.CreateAnonymousThread(procedure
  90. begin
  91. while True do
  92. begin
  93. if Form1.CheckBox2.Checked then
  94. Exit;
  95.  
  96. if Form1.FFlag then
  97. begin
  98. System.MonitorEnter(Form1);
  99. Log('Thread2 Enter');
  100. System.MonitorWait(Form1, INFINITE);
  101. Log('Thread2 WaitFor');
  102. System.MonitorExit(Form1);
  103. Log('Thread2 Exit');
  104. end;
  105.  
  106. Log(DateTimeToStr(Now));
  107. TThread.Sleep();
  108. end;
  109. Log('Thread Exit');
  110. end).Start;
  111. end;
  112.  
  113. 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);

delphi 多线程之System.TMonitor的更多相关文章

  1. delphi 多线程之System.TMonitor (续一)

    unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System ...

  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. Python常用数据类型

    一 .列表 name = ['zhangshan', 'lishi', 'wangwu']# 列表赋值 name.append('liujun')# 增,默认增加到最后位置 name.insert(1 ...

  2. Python Day2 Learning record

    一.python初始化模块                                                        Python的强大之处在于他有非常丰富和强大的标准库和第三方库 ...

  3. Gurobi在Python环境里安装与使用(Windows环境)

  4. C#中异步使用及回调

    1. 一句话理解异步 我叫你去吃饭,叫完你不去,那我就会一直等你,直到你和我一起去吃饭.这叫同步! 我叫你去吃饭,叫完不管你去不去,我都不会等你,我自己去吃饭.这叫异步! 2. 异步使用 static ...

  5. [JDBC] 实用性能提升

    在Java以及JavaWeb中,应用的性能是很重要的.尤其是数据库后端对应用的性能影响. 一.使用缓存 性能问题大多数情况下罪魁祸首是访问数据库的那些代码.因为连接到数据库需要准备好连接(connec ...

  6. JavaScript的popup框

    JavaScript中可以创建三种消息框:警告框.确认框.提示框. 1.警告框 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作. 语法:alert(&q ...

  7. iftop流量监控工具

    下载iftop工具的源码包 # wget http:oss.aliyuncs.com/aliyunecs/iftop-0.17.tar.gz 安装所需的依赖包 # yum -y install gcc ...

  8. EMMET 的HTM自动生成

    { // Custom snippets definitions, as per https://github.com/emmetio/emmet/blob/master/snippets.json ...

  9. 为UITextField增加MaxLength特性

    iOS 实现方案 在 HTML 的世界里,输入框天生就有 MaxLength 属性,可以限制用户输入的最大字符数量 可惜 iOS 上对应的 UITextField 并没有这样方便的属性,只有自己动手来 ...

  10. linux ps 按进程消耗内存资源大小排序

    linux ps 关于sort的解释 --sort spec specify sorting order. Sorting syntax is [+|-]key[,[+|-]key[,...]] Ch ...