当前位置: 首页 > news >正文

[原创][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()的等待与唤醒同步操作.

相关文章:

[原创][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、Delph…...

6.12ctf练习

[西湖论剑 2022]Node Magical Login 源码在这里&#xff1a;GitHub - CTF-Archives/2022-xhlj-web-node_magical_login: A web challenge in 2022 西湖论剑大赛打开 打开环境是个登录框&#xff0c;先进行了扫描和抓包都没有看见什么有价值的东西&#xff0c;看源码 大致连接…...

海豚调度异常处理: 使用 arthas 在内存中删除启动失败的工作流

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。祝开卷有益。大数据学习指南 大家好&#xff0c;我是小陶&#xff0c;DolphinSch…...

在Qt中,QSerialPort::write(data) 和 readAll() 有什么关联和联系

在Qt中&#xff0c;QSerialPort::write(data) 和 readAll() 是与串行通信相关的两个不同的函数&#xff0c;它们属于 QSerialPort 类。这两个函数在串行通信中扮演不同的角色&#xff0c;但它们之间存在一定的联系&#xff1a; QSerialPort::write(data) 这个函数用于将数据发…...

第 2 章:Spring Framework 中的 IoC 容器

控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;与 面向切面编程&#xff08;Aspect Oriented Programming&#xff0c;AOP&#xff09;是 Spring Framework 中最重要的两个概念&#xff0c;本章会着重介绍前者&#xff0c;内容包括 IoC 容器以及容器中 …...

构造函数、实例、原型对象三者之间的关系

在 JavaScript 中&#xff0c;构造函数、实例和原型对象之间有着密切的关系。下面是对它们之间关系的详细解析和代码示例&#xff1a; 构造函数&#xff1a;构造函数是一个特殊的函数&#xff0c;用于创建对象的模板。它定义了对象的属性和方法。构造函数通常以大写字母开头&a…...

人工智能抢走了他们的工作。现在他们得到报酬,让它听起来像人类

人工智能抢走了他们的工作。现在他们得到报酬&#xff0c;让它听起来像人类 如果你担心人工智能会如何影响你的工作&#xff0c;那么广告文案的世界或许能让你窥见未来。 作家本杰明米勒(化名)在2023年初非常红火。他领导了一个由60多名作家和编辑组成的团队&#xff0c;发表博…...

大模型微调出错的解决方案(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

企业多云策略的优势与实施指南

企业在选择云服务提供商时&#xff0c;常见的选项包括亚马逊AWS、微软Azure、谷歌云GCP、阿里云、腾讯云和华为云。为了避免过度依赖单一供应商&#xff0c;许多企业选择采用多云策略&#xff0c;这样可以充分利用不同云服务的优势&#xff0c;同时避免重复工作和其他额外的工作…...

vue分页

先看效果 再看代码 <!-- 分页 --><div v-if"pageParams.pageCount > 1" class"flex justify-end mt-6"><n-paginationv-model:page"pageParams.page" v-model:page-size"pageParams.pageSize" :page-count"pa…...

服务器上设置pnpm环境变量

首先&#xff0c;确认 pnpm 是否已经安装&#xff1a; ls /www/server/nodejs/v20.10.0/bin/pnpm如果输出包含 pnpm&#xff0c;那么说明 pnpm 已经安装。 如果没有看到 pnpm&#xff0c;你可能需要重新安装它&#xff1a; npm install -g pnpm接下来&#xff0c;确保 PATH …...

Java中BIO、NIO、AIO详解

参考&#xff1a; https://blog.csdn.net/s2152637/article/details/98777686 https://blog.csdn.net/bigorsmallorlarge/article/details/137292669 1、几个基本概念 Java中IO模型简介 在Java中&#xff0c;主要有三种IO模型&#xff0c;分别是&#xff1a; 同步阻塞IO&…...

cloud_enum:一款针对不同平台云环境安全的OSINT工具

关于cloud_enum cloud_enum是一款功能强大的云环境安全OSINT工具&#xff0c;该工具支持AWS、Azure和Google Cloud三种不同的云环境&#xff0c;旨在帮助广大研究人员枚举目标云环境中的公共资源&#xff0c;并尝试寻找其中潜在的安全威胁。 功能介绍 当前版本的cloud_enum支…...

图像的对比度和亮度

目标 访问像素值用0来初始化矩阵cv::saturate_cast像素转换提高一张图像的亮度 原理 图像处理 图像变换可以被视作两个步骤&#xff1a; 点操纵&#xff08;像素转换&#xff09;相邻区域转换&#xff08;以面积为基础&#xff09; 像素转换 在这种图像处理的转换过程中…...

手撕设计模式——计划生育之单例模式

1.业务需求 ​ 大家好&#xff0c;我是菠菜啊。80、90后还记得计划生育这个国策吗&#xff1f;估计同龄的小伙伴们&#xff0c;小时候常常被”只生一个好“”少生、优生“等宣传标语洗脑&#xff0c;如今国家已经放开并鼓励生育了。话说回来&#xff0c;现实生活中有计划生育&…...

Mac M3 Pro 部署Flink-1.16.3

目录 1、下载安装包 2、解压及配置 3、启动&测试 4、测试FlinkSQL读取hive数据 以上是mac硬件配置 1、下载安装包 官网&#xff1a;Downloads | Apache Flink 网盘&#xff1a; Flink 安装包 https://pan.baidu.com/s/1IN62_T5JUrnYUycYMwsQqQ?pwdgk4e Flink 已…...

Mysql 的分布式策略

1. 前言 MySQL 作为最最常用的数据库&#xff0c;了解 Mysql 的分布式策略对于掌握 MySQL 的高性能使用方法和更安全的储存方式有非常重要的作用。 它同时也是面试中最最常问的考点&#xff0c;我们这里就简单总结下 Mysq 的常用分布式策略。 2. 复制 复制主要有主主复制和…...

记录一个利用winhex进行图片隐写分离的

前提 是一次大比武里面的题目&#xff0c;属实给我开了眼&#xff0c;跟我之前掌握的关于隐写合并的操作都不一样。 它不是直接在文件里面进行输入文件隐写&#xff0c;叫你输入密码&#xff0c;或者更改颜色&#xff0c;或者偏移位置&#xff1b; 它不是单纯几个文件合并&a…...

压缩映射定理证明

收缩映射定理&#xff08;又称Banach不动点定理&#xff09;是一个重要的结果&#xff0c;特别是在分析和应用数学中。 定理&#xff08;收缩映射定理&#xff09;&#xff1a;假设是一个从度量空间 (X,d) 到自身的函数&#xff0c;如果 是一个收缩映射&#xff0c;即存在常数 …...

Ubuntu20.04.6操作系统安装教程

一、VMware Workstation16安装 选择安装VMware Workstation&#xff0c;登录其官网下载安装包&#xff0c;链接如下&#xff1a; 下载 VMware Workstation Pro 下载后运行安装向导&#xff0c;一直Next即可。 二、Ubuntu镜像下载 ubuntu20.04 选择需要下载的镜像类型下载即…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》

近日&#xff0c;嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》&#xff0c;海云安高敏捷信创白盒&#xff08;SCAP&#xff09;成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天&#xff0c;网络安全已成为企业生存与发展的核心基石&#xff0c;为了解…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程

基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...