基于 QWorker 的多线程编程-使用分组作为业务处理队列

作业分组在 QWorker 中是一个重要的组成部分,它是对作业的一个二次封装,以方便上层应用进行调用。但也因为它的封装的特性,相对于直接管理可能会引入一些额外的开销,但与易用性相比,许多时候这点开销我们都忽略不计了。 在本节内容中,我们继续上一个话题,这个话题是由于根据群里广大群友实际遇到的问题,做的一个简单示例。 本

QWorker 技巧 – 多步作业中参数重复投寄

QWorker  中作业投递时,如果需要传递一个参数,但我们如果设置jdfFreeAsObject,那么显然单次作业完成后,相关的参数就会被释放,无法传递到下一个作业。那么这个时候,我们该怎么做呢? 本文提供了一个简单的办法来解决这一问题:用 QString 单元为您提供的 TQPtr 做智能指针封装,然后作业时使用

基于 QWorker 的多线程编程 – 作业分组

在前面的章节中,我们讨论了常见的简单作业类型的处理,这种作业如果有多步,我们就需要自己手动在作业中投递新的作业,那么我们有没有一种办法来简化这种操作呢?这就是我们接下来要讨论的内容。 作业分组在 QWorker 中使用 TQJobGroup 来管理,用于将一到多个作业给组合在一起当做一个对象来处理。这些作业有可能是串行

基于 QWorker 的多线程编程 – 状态机:信号与广播

前面我们讨论了定时作业(Post/Delay/At)和直接用 Post 来触发作业,也就是说,作业触发和执行之间是紧密耦合的。作业的触发者知道作业的响应者在那儿,要干什么,但如果我们要将作业的触发与执行分离,该怎么做呢?信号!QWorker 提供了信号机制来解决这一问题。 QWorker 中信号的作用就在于建立触发者和

[教程]基于 QWorker 的多线程编程专题

离线版不定期更新,下载地址:百度网盘 1、引言 2、不同的作业视角 3、第一个作业 4、传递参数给作业 5、后台线程与用户界面交互 6、清理现场 7、线程定时器 8、状态机-信号与广播 9、作业分组 10、使用分组作为业务处理队列 11、工作流控制 12、For 并行 13、状态跟踪 14、同步与锁定 15、附加选项

基于 QWorker 的多线程编程 – 线程定时器

在实际编程环境中,我们常需要定时执行一项任务,比如每隔1小时,执行一次同步操作,而这些操作如果放到主线程中使用普通的 TTimer 执行,由于需要占用主线程的资源,可能会造成程序明显的卡顿。这时候,我们就需要使用后台定时器来完成这一操作(当然 QWorker 也支持主线程中的定时作业,此时就相当于你在窗口上放置了一个T

基于 QWorker 的多线程编程 – 清理现场

有人雇佣了一些工人干活,但不幸的是,这个人在所有作业完成前,消失在那蓝色星球中的人海找不到了,于是,悲剧的工人在找他要工钱时,发现已经无法找到人了,于是工人暴怒,进行疯狂的破坏,结果就是异常发生了。为了避免工人的暴动,雇主应该在消失之前,清理作业,与工人进行结算,这样才能建设和谐社会嘛。 QWorker 中的作业在提交

基于 QWorker 的多线程编程 – 后台线程与用户界面交互

我们知道,后台作业不能直接访问和操作用户界面元素。实际上,所谓的直接访问并不是绝对的,但属性这个东西你读时,可能执行的是一个读函数,它是否内部进行了一些不安全的写操作,有时候是叫不准的,那么,显然不在后台作业中访问更安全。 那么,我们如果需要和前面的用户界面交互该怎么做? 在进一步讨论之前,我们首先要明白和主线程进行交

基于 QWorker 的多线程编程 – 同步与锁定

凡是多线程编程,几乎就离不开同步和锁定这个话题。在深入探讨之前,首先我们了解下同步和锁定是怎么回事: 同步是为了在多线程中串行化对公共资源的访问而采取的一种策略,相关的对象在 Delphi 中在 syncobjs 和sysutils 单元。一般来说,多线程读取在整个应用程序生存周期内,始终保持不变的公共资源是安全,就象

基于 QWorker 的多线程编程 – 传递参数给作业

在上一节中,我们看到这个示例实在是太简单了,实际在作业处理过程中,稍微复杂一点的作业,我们都需要传递参数给作业的处理函数。那么怎么传递参数给作业呢? 在 Post 函数的声明中,我们看到有一个 AData 参数,是一个无类型的指针,我们实际上就是通过它来作业传递参数。我们知道,无类型指针实际上是一个整数来记录地址的值,

基于 QWorker 的多线程编程-不同的作业视角

前一章我们说了,QWorker 是基于作业的视角来考虑的,所以,这一章,我们试图从不同的视角来解读下作业的分类,古语说“横看成岭侧成峰,远近高低各不同”,我们也横七竖八的切分下看看。 1、从作业的运行线程环境来分 我们知道,许多东西如窗体上的控件,都不是线程安全的,如果我们在后台线程中直接访问它,会发生意想不到的错误。

基于 QWorker 的多线程编程-引言

QWorker 是 QDAC 项目带给大家的一套多线程并行编程框架。它基于作业的视角来规划作业多线程编程,简化多线程编程的步骤和方法和交互手法。 首先,我们要明白我们为什么需要多线程并行编程? 我们之所以使用多线程编程,一般目的不外乎下面两个: 1、避免程序界面假死带来的恶劣用户体验。 2、充分利用现代计算机的处理资源

[dcc32 Fatal Error] F2039 Could not create output file 问题的解决

这个 IDE 的 Bug 困扰了我好长时间,不得已往往重启系统了事。今天再次遇到了,然后通过 Process Explorer 发现文件竟然被 adb.exe 占据,话说,俺 Windows 程序与 adb 有个大头鬼关系呀?!强行结束 adb.exe 后,该文件自动消失,感觉是IDE在删除这个文件时,而该文件却错误的

QJson 更新-修正了 TQHashedJson 的两处Bug

【问题描述】 1、在调用 Parse 来解析一个 Json 封包的数据块时,没有正确的更新结点的哈希值,造成 Parse 后明明有的结点,用 ItemByName、IndexOf 等函数检索时,无法得到对应的结果。 2、在调用 IndexOf 等函数在忽略大小写时,由于没有正确处理,造成忽略大小写选项无效。 【严重程度

QMsgPack 更新-修正了TQHashedMsgPack的两处Bug

【问题描述】 1、在调用 Parse 来解析一个 MsgPack 封包的数据块时,没有正确的更新结点的哈希值,造成 Parse 后明明有的结点,用 ItemByName、IndexOf 等函数检索时,无法得到对应的结果。 2、在调用 IndexOf 等函数在忽略大小写时,由于没有正确处理,造成忽略大小写选项无效。 【严