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