继承 于QObject多线程的使用,适合于小小白 ,本人刚入开发岗不到3个月,对自己的技术水平是很了解的,所以想通过多写文章,多积累的方式让自己迅速成长,文中若有,多谢各位指正,感激不尽。
背景:在 项目的病例管理中,需要对选中的病人信息进行 拷贝
+压缩后导入导出,如果拷贝+压缩 的信息量过大,那么主线程在执行该操作时,会造成 程序的假死状态,在这种情况下,需要进行多线程的操作 ,把拷贝 和压缩功能 放到子线程中,避免程序 进入假死状态。
工具:vs2017+Qt
多线程的继承方式有两种,分别是继承 于QObject和继承于QThread,区别就不多说了,可自查,主要说一下继承于QObject的多线程的流程。
首先,要先创建一个类,继承于QObject,.h文件 中用枚举值来标记导入导出功能 ,SetWorkerMethod()方法用来实现具体是导入还是导出的功能,槽函数为 线程函数,主要是用来实现拷贝+解压缩的功能,另外有一个信号函数,因为我在执行完函数后需要在主线程中显示一个执行完成的对话框。cpp中 没什么好说的,就是ThreadFunc()函数的实现。其他一些函数,主要是子线程在 进行动作时用来 获取主线程中的一些数据。
在主线程中的.h和.cpp才是关心的重点。
.h文件
在主线程的私有类中声明出了一个子线程类,同时还声明出了一个QThread类m_ImportExportWorkerThread。
.cpp文件
先说主线程构造函数和析构函数
在主线程类的构造函数中 ,new出刚刚的ImportExportWorker和ImportExportWorkerThread。
主线程类的析构函数中,需要安全的释放掉指针
在我的信号槽连接部分
发送线程开始的信号,同时执行 槽函数,movetoThread(),则保证了ImportExportWorkerThread被加入到 线程中。
这保证了线程的构造和析构是有效的安全的,
在我的OnImportButtonClicked()函数中,这个函数主要是用来进行导入操作的,在我点击了改按钮后,会执行以下操作
354行是子线程类中设置导入导出功能的方法,这里是eImportPatient,表示我将进行 导入病人数据的操作,那么在子线程中的函数中我就会调用导入操作,355和356行则表示子线程获取获取主线程中的数据,来进行自身的一系列操作,357行代表子线程开始执行,注意是ImportExportWorkerThread这个对象调用了start()这个方法。
之前我自己定义了一个信号,用来在子线程结束之后发送一个完成的信号,那我就可以在这个信号所对应的槽函数中,执行如下操作,来终止子线程。
导出的子线程工作 基本相同,主要是对子线程的流程结合自身的工作进行描述和总结,是一些结构性的知识。具体的多线程,有很多大佬写了,可以自己查阅。
第一次写文章,有很多不足,主要也是想给自己一个总结,不能做完之后就放在那里,只知道我曾经做过,但是怎么做的,讲不清了。路还很长,想要变得优秀,就要多积累多学习。