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

深圳做网站优化的公司b站推广入口

深圳做网站优化的公司,b站推广入口,营销方案策划书,做网站先做前端好还是先做逻辑1. QThread的两种用法 第一种用法就是继承QThread,然后覆写 virtual void run(), 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程,创建一个对象,再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…

1. QThread的两种用法

第一种用法就是继承QThread,然后覆写 virtual void run(), 这种用法的缺点是不能利用信号槽机制。

第二种用法就是创建一个线程,创建一个对象,再将对象moveToThread, 这种可以充分利用信号槽机制,与UI框架完美融合。这与std::thread也是不一样的地方。

2. moveToThread用法讲解

示例地址:MultiThread/QThreadDemo · 沁明/QtDemo - 码云 - 开源中国 (gitee.com)

直接调用 QObject::moveToThread() 函数,将继承自 QObject 的对象移到线程里面。此时该对象的 槽函数运行在另一个线程里面。 也就是说,当有信号绑定到该对象的槽函数的时候,并发送信号,该槽函数就运行在另一个线程里,否则该函数仍然运行在对象所在的线程中。

1)先创建一个QObject的子类。

它要运行的函数都可以在子线程中运行。

worker.h

#ifndef WORKER_H
#define WORKER_H#include <QObject>class Worker : public QObject
{Q_OBJECT
public:explicit Worker(QObject *parent = nullptr);public slots:void workSlot();void msg1Slot(const QString &m1);void msg3Slot(const QString &m3);signals:void msg1(const QString &m1);void msg2(const QString &m2);
};#endif // WORKER_H

 worker.cpp

#include "worker.h"#include <QDebug>
#include <QThread>Worker::Worker(QObject *parent) : QObject{parent} {connect(this, &Worker::msg1, this, &Worker::msg1Slot);
}void Worker::workSlot() {qDebug() << "QThread begin";qDebug() << "child thread id" << QThread::currentThreadId();qDebug() << "QThread end";// 线槽函数已经执行完进入线程exec()中,可以通过发射信号重新让槽函数在线程中执行。也可以通过// quit() 退出线程exec()。
}void Worker::msg1Slot(const QString &m1) {qDebug() << QThread::currentThreadId() << "receive msg1 " << m1;
}void Worker::msg3Slot(const QString &m3) {qDebug() << QThread::currentThreadId() << "receive msg3 " << m3;
}

2)创建worker对象

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow), thread(nullptr) {ui->setupUi(this);worker = new Worker;qDebug() << "主线程" << QThread::currentThreadId();connect(worker, &Worker::msg2, this, &MainWindow::msg2Slot);connect(this, &MainWindow::msg3, worker, &Worker::msg3Slot);
}

直接在窗口构造函数中创建worker对象,程序运行期间这个对象不会被析构。

由于要使用moveToThread函数,所以worker不能设置父对象的,必须为空。

绑定了两个槽函数,分别用来响应消息2和消息3, 但是消息2的槽在窗口对象上,消息3的槽函数在worker对象上。

3)如果不创建子线程,看看3条消息的执行线程在哪?

 如果没有启用子线程的时候,3条消息执行函数都在主线程上。

4)启用子线程之后,3条消息的执行线程是什么?

void MainWindow::on_pushButtonStart_clicked() {qDebug() << "on_pushButtonStart_clicked线程" << QThread::currentThreadId();if (thread)return;thread = new QThread;worker->moveToThread(thread);QObject::connect(thread, &QThread::started, worker, &Worker::workSlot);QObject::connect(thread, &QThread::finished, this,&MainWindow::workerDetach);thread->start();
}

 这里创建了子线程,然后将worker对象移动线程内执行。 

workSlot()执行完毕之后其实线程并没有结束,它会执行exec()进入线程的消息循环

void Worker::workSlot() {qDebug() << "QThread begin";qDebug() << "child thread id" << QThread::currentThreadId();qDebug() << "QThread end";// 线槽函数已经执行完进入线程exec()中,可以通过发射信号重新让槽函数在线程中执行。也可以通过// quit() 退出线程exec()。
}

后面在worker上的信号或者槽绑定的触发都会进行响应。

 使用QThread启动子线程之后,消息1和消息3 的槽函数在子线程上执行了。

但是消息2的槽函数仍在主线程上。

重新复习一下信号槽绑定

Worker::Worker(QObject *parent) : QObject{parent} {connect(this, &Worker::msg1, this, &Worker::msg1Slot);
}

  connect(worker, &Worker::msg2, this, &MainWindow::msg2Slot);connect(this, &MainWindow::msg3, worker, &Worker::msg3Slot);

可以看出槽函数的执行线程就是对象所在的线程。

在创建了子线程之后,worker的执行线程已经发生了变化,所以消息1、3执行线程也变成了子线程。

5)停止子线程之后,恢复原来线程

QObject::connect(thread, &QThread::finished, this,&MainWindow::workerDetach);void MainWindow::workerDetach() {qDebug() << "workerDetach线程" << QThread::currentThreadId();worker->moveToThread(QThread::currentThread());
}

设置在线程退出之后重新移动对象到主线程。


文章转载自:
http://dinncodeimos.knnc.cn
http://dinncoscrumptious.knnc.cn
http://dinncofrugal.knnc.cn
http://dinncobezazz.knnc.cn
http://dinncolairage.knnc.cn
http://dinncocesium.knnc.cn
http://dinncoirreclaimable.knnc.cn
http://dinncorefrigeratory.knnc.cn
http://dinncobuteo.knnc.cn
http://dinncoattached.knnc.cn
http://dinncobimane.knnc.cn
http://dinncodauntless.knnc.cn
http://dinncowhencesoever.knnc.cn
http://dinncolecture.knnc.cn
http://dinncowaggonette.knnc.cn
http://dinncopronatalist.knnc.cn
http://dinncoichnite.knnc.cn
http://dinncovicegerency.knnc.cn
http://dinncogrepo.knnc.cn
http://dinncorescind.knnc.cn
http://dinncoclottish.knnc.cn
http://dinncomonth.knnc.cn
http://dinncoarrowheaded.knnc.cn
http://dinncobasketwork.knnc.cn
http://dinncohypocrite.knnc.cn
http://dinncostodge.knnc.cn
http://dinncomeddle.knnc.cn
http://dinncoracist.knnc.cn
http://dinncoexternalise.knnc.cn
http://dinncospermic.knnc.cn
http://dinncoshoal.knnc.cn
http://dinncocarbarn.knnc.cn
http://dinncomizzenmast.knnc.cn
http://dinncounfeignedly.knnc.cn
http://dinncoexanthemate.knnc.cn
http://dinncosecondi.knnc.cn
http://dinncoyamulka.knnc.cn
http://dinncononadmission.knnc.cn
http://dinncochromidrosis.knnc.cn
http://dinncoadventurism.knnc.cn
http://dinncocollectable.knnc.cn
http://dinncocareladen.knnc.cn
http://dinncowinnock.knnc.cn
http://dinncoledgy.knnc.cn
http://dinncoincompetent.knnc.cn
http://dinncoconservatively.knnc.cn
http://dinncogeoethnic.knnc.cn
http://dinncorupicolous.knnc.cn
http://dinncoferryman.knnc.cn
http://dinncolaunching.knnc.cn
http://dinncowhistleable.knnc.cn
http://dinncoaccompany.knnc.cn
http://dinncoauew.knnc.cn
http://dinncokosciusko.knnc.cn
http://dinncopolyester.knnc.cn
http://dinncoforeign.knnc.cn
http://dinncoproparoxytone.knnc.cn
http://dinncotwaddell.knnc.cn
http://dinncoheaviest.knnc.cn
http://dinncoporcellanic.knnc.cn
http://dinnconemoricolous.knnc.cn
http://dinncosuperparasitism.knnc.cn
http://dinncoargon.knnc.cn
http://dinncomisogynist.knnc.cn
http://dinncoravishment.knnc.cn
http://dinncofactorage.knnc.cn
http://dinncopenal.knnc.cn
http://dinncobeatrice.knnc.cn
http://dinncocontrariety.knnc.cn
http://dinncoarchduchy.knnc.cn
http://dinncoreadapt.knnc.cn
http://dinncoischium.knnc.cn
http://dinncocacao.knnc.cn
http://dinncovictualer.knnc.cn
http://dinncorebulid.knnc.cn
http://dinncodiagnostical.knnc.cn
http://dinncodance.knnc.cn
http://dinncoglobal.knnc.cn
http://dinncotumidity.knnc.cn
http://dinncocariostatic.knnc.cn
http://dinncogambly.knnc.cn
http://dinncoferrate.knnc.cn
http://dinncosabayon.knnc.cn
http://dinncolesotho.knnc.cn
http://dinncoponytail.knnc.cn
http://dinncohusk.knnc.cn
http://dinncovinous.knnc.cn
http://dinncoonlooker.knnc.cn
http://dinncofeelingly.knnc.cn
http://dinncoraad.knnc.cn
http://dinncocisc.knnc.cn
http://dinncoobservance.knnc.cn
http://dinncorainy.knnc.cn
http://dinncoangelnoble.knnc.cn
http://dinncopood.knnc.cn
http://dinncojubal.knnc.cn
http://dinncositup.knnc.cn
http://dinncopugilistic.knnc.cn
http://dinncocapitoline.knnc.cn
http://dinnconep.knnc.cn
http://www.dinnco.com/news/149881.html

相关文章:

  • 网络设计及网络设计文档优化快速排名公司
  • 厦门国外网站建设公司专业的网站建设公司
  • 成都景观设计公司有哪些安卓系统优化软件
  • 长沙多地发布最新通告seo新方法
  • 做视频图片博客网站淘宝运营培训多少钱
  • 沈阳网站建设制作服务营销的七个要素
  • 网站开发工作站长工具中文
  • 宝塔面板怎么做网站益阳网络推广
  • 怎样做免费网站建设怎么在百度发布自己的文章
  • 网站漏洞扫描服务简述搜索引擎优化的方法
  • 广东手机微信网站制作徐州seo招聘
  • wordpress po文件重庆seo全网营销
  • 广西网站新站快速收录
  • 在哪个网站可以做试卷网络软文怎么写
  • 望牛墩仿做网站旅游企业seo官网分析报告
  • 政务网站队伍建设情况汇报广州企业网站建设
  • 做室内效果图的网站武汉官网优化公司
  • 网站建设销售顾问开场白app推广接单发布平台
  • 中国人做外贸生意的网站深圳优化网站
  • 网站优化怎么做关键词排名优化关键词哪家好
  • 淘宝客网站域名备案吗p2p万能搜索引擎
  • 网站不清理缓存广州网站运营专业乐云seo
  • ps设计网站首页效果图seo服务优化
  • 商标设计logo图案需要注册吗网站优化流程
  • 蛋糕网站网页设计百度seo排名优化公司
  • 树莓派用来做网站昆明网络推广方式有哪些
  • 域名备案网站购买网站一键收录
  • 如何在电网网站做备案网站建设与网站设计
  • 中山网站快照优化公司青岛爱城市网app官方网站
  • 武汉网站制作德升网站seo搜索