qt多线程编程|Qt多线程功能简化方案
UI程序中经常有一些耗时的操作要处理,如果直接在UI线程中执行,整个界面都会卡住,出现无响应状态。
如果每次操作都生成一个线程类,而且相关数据都要传递过去,可能处理起来会比较麻烦!
因此本篇文章的初衷就是想简化这种情况。
最开始我想到的就是按照MFC创建线程的方式进行解决。
通过类的 static 成员函数作为函数指针,通过QThread的run函数进行回调。
思路如下:
class Form : public QWidget{ Q_OBJECTpublic: Form(QWidget *parent=0) : QWidget(parent) { ... m_thread.setCallBack(run, this); m_thread.start(); }...private: void static run(QObject* obj) { Form*frm = (Form*) obj; frm->todo(); } void todo() { // 添加需要做的事情 }...private: CThread m_thread;}CThread实现方式如下
#ifndef CTHREAD_H#define CTHREAD_H#include <QThread>// 函数指针定义,用于回调的;QObject *即为传递过来的 Form 的 this 对象指针typedef void (*pFuncPointer)(QObject *); class CThread : public QThread{public: CThread(QObject *obj=0):QThread(obj) {m_obj = obj;} CThread(pFuncPointer func, QObject *obj):QThread(obj) {m_func = func; m_obj = obj;} void setCallBack(pFuncPointer func, QObject *obj) {m_func = func; m_obj = obj;} void setObj(QObject *obj) {m_obj = obj;} void setFun(pFuncPointer func) {m_func = func;}private: void run(){m_func(m_obj);} // 回调函数,将 this 传递回去private: pFuncPointer m_func; QObject *m_obj;};#endif // CTHREAD_H更进一步
由于我实在太懒了,觉得定义按照MFC那样的方式定义 static 成员函数 实在太麻烦了;
想直接一步到位,如果这样可以通过传递类的函数指针,这样就可以简化成下面这样!
思路如下:
class Form : public QWidget{ Q_OBJECTpublic: Form(QWidget *parent=0) : QWidget(parent) { ... m_thread.setCallBack(&MainForm::todo, this); // 成员函数指针 m_thread.start(); }...private: void todo() { // 添加需要做的事情 }...private: CThread<Form> m_thread;}CThread实现方式如下
#ifndef CTHREAD_H#define CTHREAD_H#include <QThread>template <typename T> // 模板class CThread : public QThread{public: typedef void (T::*pFuncPointer)(); // 模板函数指针 CThread(T *obj=0):QThread(obj) {m_obj = obj;} CThread(pFuncPointer func, T *obj):QThread(obj) {m_func = func; m_obj = obj;} void setCallBack(pFuncPointer func, T *obj) {m_func = func; m_obj = obj;} void setObj(T *obj) {m_obj = obj;} void setFun(pFuncPointer func) {m_func = func;}private: void run(){(m_obj->*m_func)();} // 回调,这里的写法需要注意private: pFuncPointer m_func; T *m_obj;};#endif // CTHREAD_H需要注意的地方
由于 todo 函数虽然是 Form 的成员函数,但是它是被另一个线程所调用的,所以它不属于UI线程。
在更新界面相关,或者需要更新界面信息时,可以在 Form 里面定义信号和对应的槽;
而且连接的时候,最好明确指明最后一个参数为Qt::QueuedConnection。
我的砖就抛到这里,希望对你们有用。
接下来的路就请各位小伙伴们自己走了!
相关内容
-
cad经典模式怎么调|cad经典模式界面怎么设置
cad经典模式怎么调|cad经典模式界面怎么设置,经典模式,设置,...
-
暗黑快捷键|暗黑2神操作的快捷键
暗黑快捷键|暗黑2神操作的快捷键,快捷键,暗黑,操作,药水,游戏...
-
办公软件word基本操作|Word多文档操作技巧
办公软件word基本操作|Word多文档操作技巧,操作技巧,多文档,...
-
计算机二级c语言软件|二级c语言vc2010操作步骤
计算机二级c语言软件|二级c语言vc2010操作步骤,语言,二级,双...
-
小米手机如何录屏|小米手机怎么录屏操作很简单
小米手机如何录屏|小米手机怎么录屏操作很简单,小米手机,怎么...
-
app界面设计|APP界面设计如何“动”起来
app界面设计|APP界面设计如何“动”起来,界面设计,动态,情感,...
-
cad2018经典模式怎么调|3种找回cad经典界面方法
cad2018经典模式怎么调|3种找回cad经典界面方法,找回,界面,方...
-
交通管理信息平台app|手机APP交通违法自助处理
交通管理信息平台app|手机APP交通违法自助处理操作手册,平台,...
-
excel表格数据统计|求和、计数等操作透视表五秒
excel表格数据统计|求和、计数等操作透视表五秒搞定,五秒,操...
-
电脑键盘锁是哪个键|电脑安全模式操作键盘
电脑键盘锁是哪个键|电脑安全模式操作键盘,操作,键盘,安全模...
-
微信定时发送消息怎么弄|微信消息定时发送怎么
微信定时发送消息怎么弄|微信消息定时发送怎么操作,消息,操作...
-
wps去水印怎么操作|如何删除PDF中的水印
wps去水印怎么操作|如何删除PDF中的水印,操作,删除,水印,去水...
-
打印到文件是什么意思|打印到文件提示窗口,解决
打印到文件是什么意思|打印到文件提示窗口,解决方案,文件,打印...
-
降序快捷键排列怎么操作|word表格降序排列怎么
降序快捷键排列怎么操作|word表格降序排列怎么操作,排列,操作...
-
ps里反选快捷键|ps的反选怎么操作
ps里反选快捷键|ps的反选怎么操作,操作,快捷键,复制,图层,工...