概述

使用 QObject::moveToThread() 方法,可以把一个继承自 QObject 的对象交给一个 QThread 对象,然后再调用 QThread 的 start() 函数使其全权处理事件循环,当我们需要让子线程执行某个任务,只需要发出对应的信号就可以。
而继承 QThread 实现多线程方法,只能执行 run() 函数中的任务。使用 moveToThread 可以定义多个槽函数,用相应的信号触发即可。

代码示例

①.定义一个继承自 QObject 的对象

class WorkObject : public QObject
{Q_OBJECT
public:WorkObject(QObject *parent = nullptr);~WorkObject();
signals:void workStart();//工作开始void workFinished();//工作完成
private:void doWork();
public slots:void starWork();//开始工作
};WorkObject::WorkObject(QObject *parent): QObject(parent)
{}WorkObject::~WorkObject()
{qDebug() << "WorkObject 销毁" << endl;
}void WorkObject::doWork()
{for (int i = 0; i < 1000; ++i){qDebug() << i << endl;}emit workFinished();
}void WorkObject::starWork()
{emit workStart();doWork();
}

②.使用 moveToThread 转移线程

WorkObject * workObject = new WorkObject();//工作对象
QThread * workThread = new QThread();//工作线程
//转移线程
workObject->moveToThread(workThread);
//开始工作
QObject::connect(workThread, &QThread::started, workObject, &WorkObject::starWork);
//工作对象工作结束,停止线程
QObject::connect(workObject, &WorkObject::workFinished, workThread, [&]() {workThread->quit();workThread->wait();
});
//工作线程停止,销毁工作对象
QObject::connect(workThread, &QThread::finished, workObject, &WorkObject::deleteLater);
//工作对象销毁,销毁工作线程
QObject::connect(workObject, &WorkObject::destroyed, workThread, &QThread::deleteLater);
//线程销毁
QObject::connect(workThread, &QThread::destroyed, [&]() {qDebug() << "workThread 销毁" << endl;});
//启动线程workThread->start();

代码运行结果如下:

Qt 中 moveToThread相关推荐

  1. 简单说说对QT中moveToThread实现多线程操作的理解

      在平时的编码过程中经常碰到QT的多线程问题,也大量接触了QT中的两种主流多线程写法,一种是继承QThread类并重载run函数,在run函数中写一个状态机或者计时器来实现对线程运作:一种是通过mo ...

  2. QT 中的多线程之 moveToThread

    文章目录 1. 概述 2. 方法描述 3. 代码: 4. 运行结果 5. 注意事项 6. 结语 1. 概述 在 Qt 中,多线程也被广泛用于实现后台任务.异步操作.多任务处理等功能.通过使用多线程,可 ...

  3. Qt中多线程moveToThread

    Qt中实现多线程的方式.1.利用继承QThread类,重写run函数实习.2.将对象使用moveToThread方法,利用信号槽实现.3.利用QtConcurrent相关QFuture实现. 以前一直 ...

  4. QT中使用moveToThread

    QT中使用项目中很多时候会用到moveToThread,与主线程分隔开,在这里可以说一个很简单的例 子来使用,直接上代码: datasave.h文件 #ifndef DATASAVE_H #defin ...

  5. Qt中另一种创建线程的方式

    文章目录 1 Qt中另一种创建线程的方式 1.1 另一种创建线程的方式 1.2 同步型线程的设计 1.3 异步型线程的设计 1 Qt中另一种创建线程的方式 1.1 另一种创建线程的方式 历史的痕迹: ...

  6. 4.QT中进程操作,线程操作

     QT中的线程操作 T19Process.pro SOURCES += \ main.cpp CONFIG += C++11 main.cpp #include <QCoreApplicat ...

  7. QT每日一练day29:QT中的多线程探究

    一.未使用多线程,则w0先运行完后,w1才开始运行 运行结果(GIF动图): main.cpp xiaowen_QT_day29.pro QT+=widgets SOURCES += \main.cp ...

  8. QT 中多线程实现方法总结

    第一: 用QtConcurrentRun类,适合在另一个线程中运行一个函数.不用继承类,很方便 第二:用QRunnable和QThreadPool结合.继承QRunnable,重写run函数,然后用Q ...

  9. QT 中QTimer 和 startTimer()的区别

    最需要注意一点 请注意,QTimer的准确性取决于底层操作系统和硬件.timerType参数允许您自定义计时器的准确性.有关不同计时器类型的信息,请参见Qt::TimerType.大多数平台支持20毫 ...

最新文章

  1. autodesk许可证服务器,Autodesk软件工作流介绍(十)——配置网络许可服务器的步骤...
  2. maven打包导入本地jar包
  3. 用C#计算1000以内含1的数字
  4. Excel加密的Sheet如何hack
  5. win10html中文乱码,Win10预览版10125中文语言包安装及乱码解决方法
  6. unity(2017.3) C# 常用API
  7. mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame Python3.8安装Pygame教程步骤详解...
  8. python日志配置文件解释_python 之 logger日志 字典配置文件
  9. 优秀!本科生发表Nature论文,直博美国顶尖名校
  10. React中的合成事件
  11. 风控报表课程正式开启
  12. window 右击菜单启动 nodejs app
  13. API Monitor简介(API监控工具)
  14. 使用Shell工具连接虚拟机
  15. 软件测试面试题目—接口测试面试题,梦寐以求的答案来了
  16. 多业务建模在美团搜索排序中的实践
  17. xposed绕过模拟器检测_《绝地求生》手游避开模拟器检测攻略分享
  18. Explore Image Deblurring via Encoded Blur Kernel Space
  19. Dline,一款让你爱不释手的去中心化社交应用
  20. Mac设置命令行代理

热门文章

  1. GitHub上面Python排名前十得到开源项目
  2. Eclipse中JDK与JRE区别
  3. 【学习笔记】《网络安全态势感知》第四章:网络安全态势感知的认知模型
  4. IOC和DI有什么区别
  5. 这篇文章,让我一杯奶茶的时间搞懂了“StringTable”
  6. ReactQuill字数限制方案
  7. python棋盘覆盖问题,python实现棋盘覆盖问题及可视化
  8. 挖掘代码覆盖率工具中的Bug
  9. 一站式购车平台“买车车”落地,年内布局百家门店...
  10. 罗斯蒙特无线变送器648DX1E1I1WA3WK1M5Q4+701PBKKF