[原创][Delphi多线程]使用TMonitor, TEvent和TQueue配合实现TThreadQueue的经典使用案例.

[简介]
常用网名: 猪头三
出生日期: 1981.XX.XX
QQ: 643439947
个人网站: 80x86汇编小站 https://www.x86asm.org
编程生涯: 2001年~至今[共22年]
职业生涯: 20年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

[序言]
本次内容主要是学习TMonitor, TEvent和TQueue配合实现TThreadQueue的经典使用案例. 本次代码的同步等待机制是使用TEvent的WaitFor(), SetEvent()和ResetEvent()方法.

[下面是经典代码]

unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages,System.SysUtils, System.Variants, System.Classes, System.Threading, System.SyncObjs,System.Generics.Collections,Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;typeTForm1 = class(TForm)Bn_ReadThread: TButton;Bn_WriteThread: TButton;Memo_Result: TMemo;procedure FormCreate(Sender: TObject);procedure FormShow(Sender: TObject);procedure Bn_ReadThreadClick(Sender: TObject);procedure Bn_WriteThreadClick(Sender: TObject);private{ Private declarations }mpr_ShareQueue   : TQueue<string> ; // 共享数据队列mpr_Thread_Lock  : TObject ;        // 同步锁mpr_Thread_event : TEvent  ;        // 同步事件mpr_Threads_Count: Integer ;        // 写者线程的数量public{ Public declarations }procedure mpu_pro_Thread_Write(const cstr_param_Data : string) ;end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
beginmpr_ShareQueue   := TQueue<string>.Create() ;mpr_Thread_Lock  := TObject.Create();mpr_Threads_Count := 0 ;// 同步事件初始化: 手工设置信号, 初始化为非信号状态mpr_Thread_event := TEvent.Create(nil, True, False,' ') ;end;// End FormCreate()procedure TForm1.FormShow(Sender: TObject);
begin
//
end;// End FormShow()// 单个读者线程
procedure TForm1.Bn_ReadThreadClick(Sender: TObject);
beginTTask.Run(procedurevarstr_Data : string ;begin// 循环读取while True dobegin// 等待共享数据队列存储新的数据mpr_Thread_event.WaitFor(INFINITE) ;// 启动同步锁System.TMonitor.Enter(mpr_Thread_Lock) ;try// 获取数据之后, 同步在界面上显式if mpr_ShareQueue.Count > 0 thenbeginstr_Data := mpr_ShareQueue.Dequeue ;// 如果共享数据队列没有数据, 那么则通知读者线程进入等待状态if mpr_ShareQueue.Count = 0 thenbeginmpr_Thread_event.ResetEvent() ;end;// 界面显式数据TThread.Synchronize(TThread.Current, procedurebeginMemo_Result.Lines.Add(str_Data) ;end);end;finallySystem.TMonitor.Exit(mpr_Thread_Lock) ;end;end;end);end;// End Bn_ReadThreadClick()procedure TForm1.mpu_pro_Thread_Write(const cstr_param_Data : string) ;
beginTTask.Run(procedurebegin// 随机休眠时间TThread.Sleep((Random(5)+1)*1000) ;// 向共享数据队列添加数据// 启动同步锁System.TMonitor.Enter(mpr_Thread_Lock) ;trympr_ShareQueue.Enqueue(cstr_param_Data) ;// 向读者线程发出信号, 共享数据队列有新数据进入mpr_Thread_event.SetEvent();finallySystem.TMonitor.Exit(mpr_Thread_Lock) ;end;end);end;// End mpu_pro_Thread_Write()
procedure TForm1.Bn_WriteThreadClick(Sender: TObject);
varstr_Data : string ;
beginInc(mpr_Threads_Count) ;str_Data := Format('%d 号线程的数据.', [mpr_Threads_Count]) ;Bn_WriteThread.Caption := Format('2: 创建写入线程(%d)', [mpr_Threads_Count]) ;mpu_pro_Thread_Write(str_Data) ;end;// End Bn_WriteThreadClick()end.

[结尾]
上面的代码, 需要注意的细节是: TEvent的WaitFor(), SetEvent()和ResetEvent()替换了TMonitor.Wait()和TMonitor.Pulse()的等待与唤醒同步操作.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1 小时快速入门 DolphinDB

自从 DolphinDB 技能认证上线以来&#xff0c;大家学习和报考的热情就一路高涨。为了响应这份热情&#xff0c;DolphinDB 推出了一系列在线免费培训课程视频来帮助大家系统地学习和掌握 DolphinDB。 经过前后数月的精心准备和科学编排&#xff0c;《 DolphinDB 数据库入门》系…

Eureka Client 配置与高级功能

在上一篇文章中&#xff0c;我们介绍了 Eureka 的基本概念以及如何配置 Eureka Server。在这篇文章中&#xff0c;我们将继续介绍 Eureka Client 的配置以及 Eureka 的一些高级功能。 一、Eureka Client 配置 在一个微服务项目中&#xff0c;需要配置 Eureka Client 以便向 E…

有没有和ai聊天的软件?介绍这三款聊天软件

有没有和ai聊天的软件&#xff1f;在科技飞速发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;其中AI聊天软件以其独特的魅力&#xff0c;赢得了越来越多用户的青睐。今天&#xff0c;我们就来一起探索三款智能聊天软件的功…

LogicFlow 学习笔记——9. LogicFlow 进阶 节点

LogicFlow 进阶 节点&#xff08;Node&#xff09; 连线规则 在某些时候&#xff0c;我们可能需要控制边的连接方式&#xff0c;比如开始节点不能被其他节点连接、结束节点不能连接其他节点、用户节点后面必须是判断节点等&#xff0c;想要达到这种效果&#xff0c;我们需要为…

Typora—适用于 Mac 和 Win 系统的优秀 Markdown 文本编辑器

Typora 是一款适用于 Mac 和 Win 系统的优秀 Markdown 文本编辑器&#xff0c;它以其简洁易用的界面和强大的功能受到了众多用户的喜爱。 首先&#xff0c;Typora 的界面设计非常简洁直观&#xff0c;没有过多繁杂的菜单和按钮&#xff0c;让用户能够专注于写作本身。它采用实时…

Java高级编程技术详解:从多线程到算法优化的全面指南

复杂度与优化 复杂度与优化在算法中的应用 算法复杂度是衡量算法效率的重要指标。了解和优化算法复杂度对提升程序性能非常关键。本文将介绍时间复杂度和空间复杂度的基本概念&#xff0c;并探讨一些优化技术。 时间复杂度和空间复杂度 时间复杂度表示算法执行所需时间随输…

LVS – NAT 模式集群构建

目录 1 环境准备 1.1 准备四台服务器 1.2 IP与网关均按照下图配置 1.3 网卡配置 1.4 real server 安装 web服务 1.5 安装ipvsadm 管理工具 2 使用ipvsadm管理LVS 2.1 创建集群指定使用的算法 2.2 添加真实服务器指定工作原理 2.3 查看是否正确创建集群 2.4 开启FORWARD路由转发…

每日一练 - PIM协议报文类型辨析

01 真题题目 在 PIM 协议中可能存在的报文是&#xff1a; A. JOIN/PRUNE B. ASSERT C. BOOTSTRAP D. REGISTER 02 真题答案 AB 03 答案解析 PIM&#xff08;Protocol Independent Multicast&#xff09;协议有两个主要的操作模式&#xff1a;PIM-Dense Mode (PIM-DM) 和 PIM…

​一个高清影像下载插件

数据是GIS的血液&#xff01; 虽然我们在水经微图&#xff08;简称“微图”&#xff09;中可以下载各种各样丰富的地图数据&#xff0c;但相信大家对数据的追求是无止境的。 我们现在就来分享一下&#xff0c;如何在QGIS中下载高清卫星影像的方法。 如果你需要最新版本的QGI…

最新下载:Hype 4 mac版【软件附加安装教程】

Hype是一款强大的Mac OS平台 HTML5 创作工具&#xff0c;它可以在网页上做出赏心悦目的动画效果&#xff0c;创建丰富的网页交互动画&#xff0c;支持层、时间轴等编辑方式&#xff0c;并能很好的导出HTML5/CSS3/JavaScript&#xff0c;在台式机&#xff0c;智能手机和iPad上流…

一、sorted()函数的使用

numbers[2,23,1,3,434,23,23] demosorted(numbers)#正常升序 print("\n") print(demo) demo1sorted(numbers,reverseTrue)#加上reverse变为降序 demo2sorted(numbers,reverseFalse)#加上reverse变为降序 print(demo1) print(demo2)#reverse默认为False names[Addf,aD…

裁剪图片的最简单方法?这四种裁剪方法真的超级简单!

裁剪图片的最简单方法&#xff1f;在丰富多彩的现代生活中&#xff0c;图片成为了我们表达、沟通甚至展示身份的重要媒介&#xff0c;然而&#xff0c;无论是出于个人审美还是专业需求&#xff0c;图片的格式和尺寸往往成为了我们不得不面对的问题&#xff0c;特别是那些未经雕…

flink1.12.0学习笔记(一)-部署与入门

flink1.12.0学习笔记&#xff08;1&#xff09;-部署与入门 1-1-Flink概述 Flink诞生 Flink 诞生于欧洲的一个大数据研究项目 StratoSphere。该项目是柏林工业大学的一个研究性项目。早期&#xff0c; Flink 是做 Batch 计算的&#xff0c;但在 2014 年&#xff0c; StratoS…

mathtype7.6官方无需激活版安装包下载

大家好&#xff0c;今天我要和大家分享的是一款非常实用的数学工具——mathtype7.6最新版本&#xff01;&#x1f4d0; 作为一个数学专业的学生&#xff0c;我经常需要处理大量的数学公式和符号。以前我都是用手写或者电脑自带的公式编辑器&#xff0c;但是效率低下而且容易出错…

React中数据响应式原理

React作为当下最流行的前端框架之一&#xff0c;以其声明式编程和组件化架构而广受开发者喜爱。而React的数据响应式原理&#xff0c;是其高效更新DOM的核心机制。本文将深入探讨React中数据响应式原理&#xff0c;并结合代码示例进行论证。 响应式原理概述 在React中&#x…

课设--学生成绩管理系统(二)

欢迎来到 Papicatch的博客 目录 &#x1f40b;引言 &#x1f988;编写目的 &#x1f988;项目说明 &#x1f40b;产品介绍 &#x1f988;产品概要说明 &#x1f988;产品用户定位 &#x1f988;产品中的角色 &#x1f40b; 产品总体业务流程图 &#x1f40b; 产品功…

装机必备-WinRAR安装教程

软件介绍&#xff1a;WinRAR 是一款功能强大的压缩包管理器&#xff0c;可用于备份数据&#xff0c;缩减电子邮件附件的大小&#xff0c;解压缩从 Internet 上下载的RAR、ZIP及其它类型文件&#xff0c;新建 RAR 及 ZIP 格式等的压缩类文件。这是我们新电脑或重装系统后必须安装…

Redis 分布式锁过期了,还没处理完怎么办?

为了防止死锁&#xff0c;我们会给分布式锁加一个过期时间&#xff0c;但是万一这个时间到了&#xff0c;我们业务逻辑还没处理完&#xff0c;怎么办&#xff1f; 这是一个分布式应用里很常见到的需求&#xff0c;关于这个问题&#xff0c;有经验的程序员会怎么处理呢&#xff…

c++ 笔记二

1.可变参数和限制输入&#xff1a; 代码&#xff1a;不限制输入&#xff0c;返回的总和 #include <iostream> #include <filesystem> #include <string> #include <vector>template<class Type> concept AddAble requires(Type T1, Type T2) …

adb常用命令详解--提升开发效率利器

文章目录 文件管理截屏与录屏logcat 使用dumpsys 相关ps 相关am 相关pm 相关wm 相关setprop 设置属性input 相关adb connect 远程无线调试其它 本文首发地址 https://h89.cn/archives/281.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 博主 Linux 使用较多&#x…