当前位置: 首页 > wzjs >正文

网页版梦幻西游礼包码昆明网络推广优化

网页版梦幻西游礼包码,昆明网络推广优化,广州做购物网站,番禺网站设计公司文章目录 多线程实现方式一:继承QThread类方式二: 使用QObject::moveToThread()方法 多线程实现 在Qt中,实现多线程编程有两种常见的方式,它们分别是通过继承QThread类和使用QObject::moveToThread()方法。 方式一:继…

文章目录

  • 多线程实现
    • 方式一:继承QThread类
    • 方式二: 使用QObject::moveToThread()方法

多线程实现

在Qt中,实现多线程编程有两种常见的方式,它们分别是通过继承QThread类和使用QObject::moveToThread()方法。

方式一:继承QThread类

通过继承QThread类并重写其run()方法,可以在新线程中执行特定的任务。

具体步骤

  1. 创建自定义线程类:继承QThread类,并重写run()方法。在run()方法中编写需要在新线程中执行的代码。

  2. 创建线程对象:在主线程中创建自定义线程类的实例。

  3. 启动线程:调用线程对象的start()方法启动线程。此时,Qt会创建一个新的线程,并在该线程中调用run()方法。

  4. 线程间通信:可以通过信号和槽机制在主线程和子线程之间进行通信。自定义线程类可以发射信号,主线程可以连接这些信号到相应的槽函数,以处理线程返回的数据或状态。

示例代码
https://github.com/BinaryAI-1024/QtStudy/tree/master/thread/createThread1

// mythread.h
#include <QThread>
#include <QDebug>class Mythread: public QThread{Q_OBJECT
public:explicit Mythread(QObject *parent = nullptr);void run();};
// mythread.cpp
#include "Mythread.h"Mythread::Mythread(QObject *parent) : QThread(parent)
{}void Mythread::run(){// 在新线程中执行的代码for (int i = 0; i < 5; ++i) {qDebug() << "Worker thread is running... (" << i << ")";QThread::sleep(1); // 模拟耗时操作}
}
//main.cpp
#include <QCoreApplication>
#include "Mythread.h"
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);Mythread thread1;thread1.start();for (int i = 0; i < 5; ++i) {qDebug() << "Main thread is running... (" << i << ")";QThread::sleep(1); // 模拟耗时操作}thread1.wait(); // 等待直到thread1线程结束return a.exec();
}

运行结果:

Main thread is running... ( 0 )
Worker thread is running... ( 0 )
Worker thread is running... ( 1 )
Main thread is running... ( 1 )
Worker thread is running... ( 2 )
Main thread is running... ( 2 )
Worker thread is running... ( 3 )
Main thread is running... ( 3 )
Main thread is running... ( 4 )
Worker thread is running... ( 4 )

优缺点分析

  • 优点:实现简单,适合需要在新线程中执行单一任务的场景。

  • 缺点

    • 强制将业务逻辑与线程控制代码耦合在一起,不利于代码的复用和维护。
    • 需要手动管理线程的生命周期,增加了代码的复杂性。

方式二: 使用QObject::moveToThread()方法

通过将QObject(或其子类)的实例移动到新线程中,可以在该线程中执行该对象的方法。这种方法更加灵活,不需要继承QThread类。

具体步骤

  1. 创建工作对象:定义一个继承自QObject的类,并在其中定义需要在新线程中执行的方法(槽函数)。

  2. 创建线程对象:在主线程中创建一个QThread实例。

  3. 移动对象到线程:调用工作对象的moveToThread()方法,将其移动到新创建的线程中。

  4. 启动线程并调用槽函数

    • 调用线程对象的start()方法启动线程。
    • 使用信号和槽机制,在主线程中发射信号,触发工作对象在新线程中执行的槽函数。
  5. 线程间通信:同样可以通过信号和槽机制在主线程和工作线程之间进行通信。工作线程可以发射信号,主线程连接这些信号到相应的槽函数,以处理线程返回的数据或状态。

示例代码
https://github.com/BinaryAI-1024/QtStudy/tree/master/thread/createThread2

//myworker.h
#include <QObject>
class MyWorker : public QObject
{
public:explicit MyWorker(QObject *parent = nullptr);void working();};
//myworker.cpp
#include <QDebug>
#include <QThread>
#include "myworker.h"MyWorker::MyWorker(QObject *parent) : QObject(parent)
{}void MyWorker:: working(){// 在新线程中执行的代码for (int i = 0; i < 5; ++i) {qDebug() << "Worker thread is running... (" << i << ")";QThread::sleep(1); // 模拟耗时操作}}
//main.cpp
#include <QCoreApplication>
#include <QThread>
#include <QDebug>
#include "myworker.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QThread thread1;MyWorker worker;// 将 worker 对象移动到 thread1 线程中,以便 working 函数在 thread1 中执行worker.moveToThread(&thread1);// 连接 QThread 的 started 信号到 MyWorker 的 working 槽函数// 当 thread1 启动时,worker 的 working 函数会被调用QObject::connect(&thread1, &QThread::started, &worker, &MyWorker::working);// 启动 thread1 线程thread1.start();for (int i = 0; i < 5; ++i) {qDebug() << "Main thread is running... (" << i << ")";QThread::sleep(1); // 模拟耗时操作}thread1.wait();return a.exec();
}

运行结果:

Main thread is running... ( 0 )
Worker thread is running... ( 0 )
Worker thread is running... ( 1 )
Main thread is running... ( 1 )
Worker thread is running... ( 2 )
Main thread is running... ( 2 )
Worker thread is running... ( 3 )
Main thread is running... ( 3 )
Main thread is running... ( 4 )
Worker thread is running... ( 4 )

优缺点分析

  • 优点

    • 将业务逻辑与线程控制代码分离,提高了代码的复用性和可维护性。
    • 可以方便地在多个线程之间移动对象,实现复杂的线程间交互。
  • 缺点:实现相对复杂一些,需要额外管理对象在新线程中的生命周期和信号槽连接。


文章转载自:

http://HI5wfOne.rkdnm.cn
http://Tsmyy3Sa.rkdnm.cn
http://2QZCLKe7.rkdnm.cn
http://Hm0UwwnO.rkdnm.cn
http://lTN3CKSI.rkdnm.cn
http://nxtcZvIF.rkdnm.cn
http://GiPTBjE7.rkdnm.cn
http://r6ugC6p0.rkdnm.cn
http://CeMrLdQE.rkdnm.cn
http://Mw99UFtK.rkdnm.cn
http://e9EBHRNN.rkdnm.cn
http://i6oMmOx6.rkdnm.cn
http://yYMo6hM5.rkdnm.cn
http://N8VWjwGQ.rkdnm.cn
http://4RbZwhNB.rkdnm.cn
http://q3jWBZ7C.rkdnm.cn
http://4BuAC6Ip.rkdnm.cn
http://d9Xk1eQe.rkdnm.cn
http://Qf53XnOu.rkdnm.cn
http://jZVRu1QZ.rkdnm.cn
http://j9jnVdqz.rkdnm.cn
http://gHRpDd1Z.rkdnm.cn
http://SQIygPoF.rkdnm.cn
http://jcHrA5SG.rkdnm.cn
http://rXpma2rQ.rkdnm.cn
http://97iecOcX.rkdnm.cn
http://oVaon3uq.rkdnm.cn
http://xc0WAWrc.rkdnm.cn
http://aw3mTsTF.rkdnm.cn
http://3TiY8ZIR.rkdnm.cn
http://www.dtcms.com/wzjs/652839.html

相关文章:

  • 建设银行软件官方网站下载网络设备维护是做什么的
  • 江苏省建设集团有限公司网站百度知道个人中心
  • 文明网i中国精神文明建设门户网站外贸网站一站式海外推广
  • 网站地图提交给百度网盟推广图片
  • 中恒诚信建设有限公司网站哈尔滨公司网站开发
  • 上海网站建设包括哪些网站怎么识别手机跳转
  • led网站免费模板济源市住房和城乡建设局网站公示
  • 网站开发工程师认证必应搜索推广
  • dede 汽车网站模板外贸公司取名字大全
  • 合肥高端网站开发公司中国工业信息网
  • 用python 做网站有经验的手机网站建设
  • 佛山网站建设公司怎么样电子商务网站cms
  • 官网网站搭建需要多少钱青岛网站开发企业
  • 呼和浩特网站制作公司wap手机建站平台
  • 男女做暧暧视频免费网站重庆建网站培训机构
  • 网站关键词在哪里修改美工素材网站有哪些
  • h5网站价格编程培训班多少钱
  • 室内设计网站推荐知乎动漫制作专业正规吗
  • 中山最好的网站建设环球新军事最新消息
  • 百度推广 帮做网站吗宁夏建筑信息平台
  • 网站开发属于公司网站建设的视频教程
  • 怎么用网站赚钱wordpress 主题 带筛选
  • 营销型网站有哪些代表郑州做企业网站
  • 盘锦做网站公司二手书网站开发需求分析
  • 泗阳做网站青岛工程造价信息网
  • asp网站建设与设计网络营销的企业网站
  • app软件免费模板下载网站少儿编程加盟店排名
  • 微信网站用什么软件做成都九度装饰设计有限公司
  • 三亚网站建设平台北京智能模板建站
  • 江门市住房和城乡建设局门户网站住房和城乡建设部网站 投诉