作业分组在 QWorker 中是一个重要的组成部分,它是对作业的一个二次封装,以方便上层应用进行调用。但也因为它的封装的特性,相对于直接管理可能会引入一些额外的开销,但与易用性相比,许多时候这点开销我们都忽略不计了。 在本节内容中,我们继续上一个话题,这个话题是由于根据群里广大群友实际遇到的问题,做的一个简单示例。 本
月度归档: 2015 年 1 月
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 更新 – 修正了在 OSX 平台无法编译的问题
【问题描述】 在编译目标为 OSX 时,由于 NEXTGEN 选项没有定义,造成错误的引用了 Windows 相关的单元,造成无法顺利编译。 【严重级别】 高 【更新级别】 推荐 【特别感谢】 L_Wming
【转】在Win7/Win8下使用VirtualBOX虚拟机安装OS X 10.9 Mavericks
直接上原文链接:http://bbs.feng.com/forum.php?mod=viewthread&tid=7625465 另一篇老外的安装说明:http://www.wikigain.com/install-mac-os-x-el-capitan-virtualbox/(使用原版) 下载的 ISO 来源
基于 QWorker 的多线程编程 – 同步与锁定
凡是多线程编程,几乎就离不开同步和锁定这个话题。在深入探讨之前,首先我们了解下同步和锁定是怎么回事: 同步是为了在多线程中串行化对公共资源的访问而采取的一种策略,相关的对象在 Delphi 中在 syncobjs 和sysutils 单元。一般来说,多线程读取在整个应用程序生存周期内,始终保持不变的公共资源是安全,就象
基于 QWorker 的多线程编程 – 传递参数给作业
在上一节中,我们看到这个示例实在是太简单了,实际在作业处理过程中,稍微复杂一点的作业,我们都需要传递参数给作业的处理函数。那么怎么传递参数给作业呢? 在 Post 函数的声明中,我们看到有一个 AData 参数,是一个无类型的指针,我们实际上就是通过它来作业传递参数。我们知道,无类型指针实际上是一个整数来记录地址的值,
基于 QWorker 的多线程编程-第一个作业
要使用 QWorker 进行后台线程作业,我们要做的第一件事,就是当然就是要引用 QWorker 这个单元,在 C++ Builder 中,要包含 qworker.hpp。 【Delphi】 uses qworker; 【C++ Builder】 #include “qworker.hpp” 在 C++ Builder
基于 QWorker 的多线程编程-不同的作业视角
前一章我们说了,QWorker 是基于作业的视角来考虑的,所以,这一章,我们试图从不同的视角来解读下作业的分类,古语说“横看成岭侧成峰,远近高低各不同”,我们也横七竖八的切分下看看。 1、从作业的运行线程环境来分 我们知道,许多东西如窗体上的控件,都不是线程安全的,如果我们在后台线程中直接访问它,会发生意想不到的错误。
基于 QWorker 的多线程编程-引言
QWorker 是 QDAC 项目带给大家的一套多线程并行编程框架。它基于作业的视角来规划作业多线程编程,简化多线程编程的步骤和方法和交互手法。 首先,我们要明白我们为什么需要多线程并行编程? 我们之所以使用多线程编程,一般目的不外乎下面两个: 1、避免程序界面假死带来的恶劣用户体验。 2、充分利用现代计算机的处理资源
QJson更新 – 修正了解析名称后包含空格时名称也被解析到名称中的问题
【问题描述】 该问题是由于 ParseName 时,没有移除右侧空格造成的。新代码在 ParseName 时加入了移除右侧空白以解决该问题。 【严重程度】 高 【更新级别】 建议 【特别感谢】 阿木
QWorker更新 – 修正了 PeekJobState.PeekSimpleJob时返回值代码错位的问题
【错误描述】 该Bug是由于 PeekSimpleJob 时 Result 的值设置返回值位置错误引起的,结果会造成简单作业的状态返回不对。 【严重程度】 中 【更新级别】 推荐 【特别感谢】 LakeView
[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 等函数在忽略大小写时,由于没有正确处理,造成忽略大小写选项无效。 【严