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

[原创][Delphi多线程]TThreadedQueue的经典使用案例.

[简介]
常用网名: 猪头三
出生日期: 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应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

[序言]
主要是记录TThreadedQueue的经典使用方式, 注意细节:
1> TThreadedQueue 内置同步机制
2> PopItem() 方法支持同步等待, 如果队列内容为空, 那么就会等待PushItem()放入元素
3> 如果TThreadedQueue<T>, 是对Integer类型进行泛型处理, 那么如果调用function PopItem(var AItem: T): TWaitResult; overload;的话, 会出现编译错误, 解决方式, 可以调用function PopItem(var AQueueSize: Integer; var AItem: T): TWaitResult; overload;进行绕过编译器错误.

[下面是经典代码]

unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages,System.SysUtils, System.Variants, System.Classes, System.Generics.Collections,System.SyncObjs, System.Threading,Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;typeTForm1 = class(TForm)Bn_ReadThread: TButton;Memo_Result: TMemo;Bn_WriteThread: TButton;procedure Bn_ReadThreadClick(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormShow(Sender: TObject);procedure Bn_WriteThreadClick(Sender: TObject);private{ Private declarations }mpr_ShareQueue : TThreadedQueue<string> ;mpr_Threads_Count : Integer ;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
beginmpr_ShareQueue    := TThreadedQueue<string>.Create() ;mpr_Threads_Count := 0 ;
end;procedure TForm1.FormShow(Sender: TObject);
beginRandomize() ;Memo_Result.Lines.Clear();Bn_WriteThread.Caption := Format('2: 创建写入线程(%d)', [mpr_Threads_Count]) ;
end;// 单个读者线程
procedure TForm1.Bn_ReadThreadClick(Sender: TObject);
beginTTask.Run(procedurevarstr_Data : string ;begin// 循环读取while True dobegin// 从线程同步队列中, 获取数据, 如果队列没有数据, 则会自动进入等待状态.if mpr_ShareQueue.PopItem(str_Data) = wrSignaled thenbegin// 获取到数据之后, 同步在界面上显式.TThread.Synchronize(TThread.Current, procedurebeginMemo_Result.Lines.Add(str_Data) ;end);endelsebeginTThread.Synchronize(TThread.Current, procedurebeginMemo_Result.Lines.Add('读取队列, 异常...') ;end);end;end;end);end;// End Bn_ReadThreadClick()// 多个写者线程(通过单击按钮, 反复创建多个写者线程)
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]) ;TTask.Run(procedurebegin// 随机休眠时间TThread.Sleep((Random(5)+1)*1000) ;// 向线程同步队列添加数据.mpr_ShareQueue.PushItem(str_Data) ;end);end;// End Bn_WriteThreadClick()end.

[运行演示效果]

相关文章:

  • 双指针解题
  • uniapp uni-popup内容被隐藏问题
  • Python编程学习第一篇——Python零基础快速入门(五)—变量
  • k8s怎么监听资源的变更
  • Linux前端与Windows前端区别:深入剖析两大系统的前端差异
  • python 深浅拷贝
  • 网络编程介绍(二)(端口、通信协议)
  • Javaweb基础之工程路径
  • 初始操作系统
  • 10分钟了解ERP软件系统
  • 【竞技宝】欧洲杯:德国被乌克兰逼平,27脚射门仍难得分!
  • 【面试干货】 非关系型数据库(NoSQL)与 关系型数据库(RDBMS)的比较
  • 从0开始学人工智能测试节选:Spark -- 结构化数据领域中测试人员的万金油技术(三)
  • Docker 部署 OCRmyPDF、提取PDF内容
  • 实时数据传输:Django 与 MQTT 的完美结合
  • 【391天】每日项目总结系列128(2018.03.03)
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • axios 和 cookie 的那些事
  • const let
  • ES6简单总结(搭配简单的讲解和小案例)
  • Javascripit类型转换比较那点事儿,双等号(==)
  • java中具有继承关系的类及其对象初始化顺序
  • Python_网络编程
  • python大佬养成计划----difflib模块
  • Python学习之路16-使用API
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Theano - 导数
  • 将回调地狱按在地上摩擦的Promise
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 深入 Nginx 之配置篇
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 突破自己的技术思维
  • 译有关态射的一切
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​水经微图Web1.5.0版即将上线
  • #HarmonyOS:基础语法
  • ()、[]、{}、(())、[[]]命令替换
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (js)循环条件满足时终止循环
  • (附源码)ssm高校实验室 毕业设计 800008
  • (顺序)容器的好伴侣 --- 容器适配器
  • (算法)Game
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .bat批处理(六):替换字符串中匹配的子串
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET连接MongoDB数据库实例教程
  • /var/spool/postfix/maildrop 下有大量文件
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...