没有合适的资源?快使用搜索试试~ 我知道了~
首页QWorker多线程编程框架详解与实战
QWorker多线程编程框架详解与实战
需积分: 0 1 下载量 182 浏览量
更新于2024-06-30
收藏 701KB PDF 举报
"基于QWorker的多线程编程V1.11是由QDAC开发组成员swish创作的一个多线程编程框架,旨在简化并行编程的过程。该框架的核心是QWorker,它从作业的角度出发,提供了高效且易于管理的多线程编程手段。版本1.11包含了作者在2015年4月2日的最新修订,适用于QDAC项目的使用者,特别是官方QQ群250530692的活跃成员。 QWorker作为QDAC的一部分,强调了开源性和社区支持的重要性,鼓励用户自由地复制、分发和修改代码,但必须尊重版权,确保作者的贡献能得到回馈。在使用QWorker时,用户应明确知道作者对项目的品质不负担保责任,且在使用前需自行评估潜在风险。遇到技术问题,官方支持通过QQ群和电子邮件提供,但需保持专业交流,避免无意义的干扰和人身攻击。 本教程分为五个章节:第一章介绍QWorker的基本概念和设计理念;第二章深入探讨不同的作业视角,可能涉及任务分解和调度策略;第三章通过实例展示如何创建和使用第一个QWorker作业;第四章讲解如何在作业之间传递参数,以实现数据共享;最后,第五章可能涵盖更高级的主题,如错误处理和作业的生命周期管理。 QWorker的目的是通过提供清晰的文档和注释,使开发者能够快速上手并充分利用多线程优势,提升应用程序的性能。对于希望进一步获得个性化服务或赞助项目发展的朋友,作者提供了单独培训和赞助的方式,包括支付宝和建设银行的支付方式。 基于QWorker的多线程编程框架是一个实用且注重社区互动的工具,有助于简化并行编程的工作流程,特别适合于QDAC项目的开发者和爱好者使用。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86328166/bgd.jpg)
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
void __fastcall DoHelloworld(PQJob AJob);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
(
2
)主文件:
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DoHelloworld(PQJob AJob)
{
ShowMessage("Hello,world");
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Workers->Post(DoHelloworld,NULL,true);
}
//---------------------------------------------------------------------------
看看程序的运行效果:
![](https://csdnimg.cn/release/download_crawler_static/86328166/bge.jpg)
好了,效果看到了。我们看看刚才用到的 Post 函数的声明:
【Delphi】
function Post(AProc: TQJobProc; AData: Pointer;ARunInMainThread: Boolean = False;AFreeType:
TQJobDataFreeType = jdfFreeByUser): IntPtr; overload;
【
C++ Builder
】
NativeInt __fastcall Post(TQJobProc AProc, void * AData, bool ARunInMainThread = false,
TQJobDataFreeType AFreeType = (TQJobDataFreeType)(0x0))/* overload */;
这个函数的作业是投寄一个需要立即在后台执行的作业,如果成功,返回一
个作业的句柄实例,如果失败,返回 0。其参数含义如下:
AProc :要执行的作业处理函数
AData
:作业附加的用户数据指针,其具体含义由作业处理函数自行解析,
可以用来传递作业需要的参数
ARunInMainThread:作业是否要求在主线程中执行,如果作业需要在主线
程执行,则设置为 true,如果不需要,则设置为 false
好了,这个最经典的 HelloWorld 就此搞定,是不是觉得很简单?好复杂?!
算了,编程不适合你,开玩笑:)
![](https://csdnimg.cn/release/download_crawler_static/86328166/bgf.jpg)
第四章 传递参数给作业
在上一节中,我们看到这个示例实在是太简单了,实际在作业处理过程中,
稍微复杂一点的作业,我们都需要传递参数给作业的处理函数。那么怎么传递参
数给作业呢?
在 Post 函数的声明中,我们看到有一个 AData 参数,是一个无类型的指
针,我们实际上就是通过它来作业传递参数。我们知道,无类型指针实际上是一
个整数来记录地址的值,在 32 位程序中,它是 32 位的,在 64 位程序中,它是
64 位的,那么,我们实际上,对于小于等于 32 的内容,是可以直接传值的,这
样做的好处是不需要额外的释放步骤,而 64 位的内容则需要视我们的具体程序
环境而定,具体可参考下表:
当然,这些可以直接传值的类型,我们也需要做一些简单的技巧性处理,如
传递一个字符时,Delphi 中就可能需要用到 Ord 函数传它的内码,而传递一个
整数类型的值时,我们就需要强制转换一个,Pointer(值)即可,而传递浮点值
时,则需要更复杂一点的转换,您可以用 absolute 语法,也可以使用取地址转
换的办法来完成。如下所示:
//
整数类型
Pointer(100);
//
浮点类型
-absolute
var
f:Single;
i:Integer absolute f;
![](https://csdnimg.cn/release/download_crawler_static/86328166/bg10.jpg)
begin
...
f:=1.2;
...
Pointer(i);
...
end;
//浮点类型-强转
Pointer(PInteger(
@f
)^);
当然,到了作业中相应的需要将 Pointer 反转换来就可以了,具体就不再缀
述,省得大家认为我在骗字数。
上面的简单类型传递已经搞定了,那么复杂的类型传递我们怎么传呢?大家
可能注意到了 Post 函数还有一个参数叫 AFreeType,它指定了 AData 指针关
联的对象如何去释放。QWorker 默认提供了下面几种释放方式:
jdfFreeByUser
:用户自己负责,
QWorker
可以当甩手掌握的
jdfFreeAsObject
:传递的是一个对象指针,
QWorker
在作业生命周期结
束时,调用对象的析构函数释放
jdfFreeAsSimpleRecord
:传递的是一个简单记录类型,
QWorker
在作业
生命周期结束时,直接调用
Dispose(Pointer)
来释放,注意不要传递包含
字符串类型
/
接口
/
动态数组等类型的成员,否则会造成内存泄露
jdfFreeAsInterface
:传递的是一个接口,
QWorker
会自动调用
AddRef
和
Release
来维护其生命周期
jdfFreeAsC1 ~ jdfFreeAsC6
:传递的是一个用户自定义的内存释放方式,
由用户自行指定
Workers.OnCustomFreeData
事件的响应函数来处理
看起来挺多的,但实际的业务需要可能更复杂,那么我们能不能进一步简化
呢?万能的神龙,变变变~~~TQJobExtData 登场了,AData 参数传递的是
TQJobExtData 这个类型的一个实例,然后由它提供了一层封装。当然了,因为
TQJobExtData 是一个类,所以 AFreeType 必需手动指定为 jdfFreeAsObject。
我们看这个类的声明:
TQJobExtData = class
private
function GetAsBoolean: Boolean;
function GetAsDouble: Double;
function GetAsInteger: Integer;
function GetAsString: QStringW;
procedure SetAsBoolean(const Value: Boolean);
procedure SetAsDouble(const Value: Double);
procedure SetAsInteger(const Value: Integer);
procedure SetAsString(const Value: QStringW);
剩余76页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/19c8380295dd4276be4308200480a3cd_weixin_35756130.jpg!1)
八位数花园
- 粉丝: 215
- 资源: 281
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Lombok 快速入门与注解详解
- SpringSecurity实战:声明式安全控制框架解析
- XML基础教程:从数据传输到存储解析
- Matlab实现图像空间平移与镜像变换示例
- Python流程控制与运算符详解
- Python基础:类型转换与循环语句
- 辰科CD-6024-4控制器说明书:LED亮度调节与触发功能解析
- AE particular插件全面解析:英汉对照与关键参数
- Shell脚本实践:创建tar包、字符串累加与简易运算器
- TMS320F28335:浮点处理器与ADC详解
- 互联网基础与结构解析:从ARPANET到多层次ISP
- Redhat系统中构建与Windows共享的Samba服务器实战
- microPython编程指南:从入门到实践
- 数据结构实验:顺序构建并遍历链表
- NVIDIA TX2系统安装与恢复指南
- C语言实现贪吃蛇游戏基础代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)