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

网站做造价2023b站免费推广入口游戏

网站做造价,2023b站免费推广入口游戏,想开个小说网站怎么做,做网站哪家文章目录 一、moveToThread()执行后,当前代码线程没有改变。二、对象执行moveToThread()后,哪些成员加入了子线程1、创建对象时不指定父对象2、对属性对象使用moveToThread加入子线程作用域3、将属性对象的创建放到子线程中执行 三、C内存模型 在使用“继…

文章目录

  • 一、moveToThread()执行后,当前代码线程没有改变。
  • 二、对象执行moveToThread()后,哪些成员加入了子线程
    • 1、创建对象时不指定父对象
    • 2、对属性对象使用moveToThread加入子线程作用域
    • 3、将属性对象的创建放到子线程中执行
  • 三、C++内存模型

在使用“继承QObject+QThread”实现多线程时,出现了一个BUG,最后发现是对moveToThread()函数理解不到位导致的。为了弄清楚这个问题最好将Demo代码拷贝,跟着跑一遍。

//a.h
#pragma once
#include "c.h"class A: public QObject
{Q_OBJECT
public:A();
public:void begin();public:QThread* subThread;int x;C* c;
};
//a.cpp
#include "a.h"
#include <QThread>
#include <QDebug>
#include <QTimer>A::A():subThread(new QThread),c(new C)
{qDebug() << "1=" << QThread::currentThreadId();this->moveToThread(subThread);qDebug() << "2=" << QThread::currentThreadId();connect(subThread, &QThread::started, this, &A::begin);
}
void A::begin(){qDebug() <<"begin()" << QThread::currentThread();// QTimer* timer = new QTimer(c);}
//c.h
#pragma once
#include <QObject>
class C:public QObject{Q_OBJECT
public:C();void print();
};
//c.cpp
#include "c.h"
#include <QThread>
#include <QDebug>
C::C(){}
void C::print(){qDebug() << "C=" <<QThread::currentThreadId();
}
//main.cpp
#include "mainwindow.h"
#include "a.h"
#include <QApplication>
#include<QThread>
#include<QDebug>
int main(int argc, char *argv[])
{QApplication a(argc, argv);A* aa = new A;aa->subThread->start();return a.exec();
}

一、moveToThread()执行后,当前代码线程没有改变。

在这里插入图片描述
为了方便说明问题,这里引入线程作用域的概念,它表示哪些变量加入该线程。this->moveToThread(subThread) 的作用是将在主线程中类A的对象本身加入子线程subThread。由于moveToThread()只是在将调用者加入到其他线程的作用域里,所以当前线程没有任何变化。需要注意的是,此时A对象同时属于两个线程的作用域:主线程和子线程sunThread。

二、对象执行moveToThread()后,哪些成员加入了子线程

如果想当然的认为 this->moveToThread(subThread) 将this所指对象的全部成员加入到subThread的作用域中,那么就会大错特错。首先考虑A中方法begin(),通过调用可以发现通过信号started调用时,它的线程ID=0x321c,说明 this->moveToThread(subThread) 将对象的方法加入了子线程的作用域。

下面取消代码中的注释:
在这里插入图片描述
然后运行代码,发现程序报错:
在这里插入图片描述
这是因为Qt不允许为线程作用域外的对象创建子对象。同时这说明A的属性 c 并没有加入到子线程subThread中。解决方法有三个:

1、创建对象时不指定父对象

 QTimer* timer = new QTimer(); //这样只适用于一小部分情况

2、对属性对象使用moveToThread加入子线程作用域

c->moveToThread(subThread);	//这是一个简单有效的办法

3、将属性对象的创建放到子线程中执行

void A::begin(){qDebug() <<"begin()" << QThread::currentThreadId();c = new C;QTimer* timer = new QTimer(c);
}

三、C++内存模型

c++内存模型参考内存模型。
C++内存分为堆、栈、代码区、全局/静态存储区、常量存储区共5个区域。
结合C++内存模型,可以知道类的方法与类的属性对象存储区域不一样,也就可以解释为什么moveToThread只是将类的方法加入子线程的作用域。


文章转载自:
http://recertification.mzpd.cn
http://mainour.mzpd.cn
http://anguished.mzpd.cn
http://troposphere.mzpd.cn
http://misgovern.mzpd.cn
http://bookrack.mzpd.cn
http://link.mzpd.cn
http://colonizer.mzpd.cn
http://sapor.mzpd.cn
http://radicalize.mzpd.cn
http://calathus.mzpd.cn
http://porcellanous.mzpd.cn
http://vlb.mzpd.cn
http://panetela.mzpd.cn
http://kazakh.mzpd.cn
http://gufa.mzpd.cn
http://brokedealer.mzpd.cn
http://downfall.mzpd.cn
http://turbine.mzpd.cn
http://yrast.mzpd.cn
http://norm.mzpd.cn
http://unconquerable.mzpd.cn
http://vigorous.mzpd.cn
http://paganize.mzpd.cn
http://veining.mzpd.cn
http://standee.mzpd.cn
http://vagary.mzpd.cn
http://sidesplitting.mzpd.cn
http://jivaro.mzpd.cn
http://diethyltoluamide.mzpd.cn
http://typification.mzpd.cn
http://causer.mzpd.cn
http://juristic.mzpd.cn
http://mistress.mzpd.cn
http://evection.mzpd.cn
http://telebus.mzpd.cn
http://antacid.mzpd.cn
http://ephemerid.mzpd.cn
http://polyacrylamide.mzpd.cn
http://toryism.mzpd.cn
http://scald.mzpd.cn
http://pegmatite.mzpd.cn
http://noseband.mzpd.cn
http://imperception.mzpd.cn
http://clubhand.mzpd.cn
http://kin.mzpd.cn
http://ajaccio.mzpd.cn
http://phloem.mzpd.cn
http://wabbly.mzpd.cn
http://podalic.mzpd.cn
http://accomplished.mzpd.cn
http://monodist.mzpd.cn
http://dunlop.mzpd.cn
http://droplet.mzpd.cn
http://camphene.mzpd.cn
http://impulsive.mzpd.cn
http://rugose.mzpd.cn
http://strategos.mzpd.cn
http://petrozavodsk.mzpd.cn
http://lillian.mzpd.cn
http://elicitation.mzpd.cn
http://goatherd.mzpd.cn
http://razon.mzpd.cn
http://kirundi.mzpd.cn
http://journo.mzpd.cn
http://antiperistalsis.mzpd.cn
http://stupendously.mzpd.cn
http://harbour.mzpd.cn
http://cosily.mzpd.cn
http://australasia.mzpd.cn
http://siracusa.mzpd.cn
http://modus.mzpd.cn
http://prosencephalon.mzpd.cn
http://kinaesthesia.mzpd.cn
http://loyally.mzpd.cn
http://palmy.mzpd.cn
http://essex.mzpd.cn
http://vivianite.mzpd.cn
http://railroader.mzpd.cn
http://aerobiosis.mzpd.cn
http://stereophonic.mzpd.cn
http://forager.mzpd.cn
http://retold.mzpd.cn
http://biosphere.mzpd.cn
http://insistence.mzpd.cn
http://vicuna.mzpd.cn
http://reliever.mzpd.cn
http://nemertinean.mzpd.cn
http://evangel.mzpd.cn
http://interterritorial.mzpd.cn
http://cavu.mzpd.cn
http://changeabout.mzpd.cn
http://gbe.mzpd.cn
http://monopteral.mzpd.cn
http://praecocial.mzpd.cn
http://versifier.mzpd.cn
http://threnetical.mzpd.cn
http://idli.mzpd.cn
http://embargo.mzpd.cn
http://outface.mzpd.cn
http://www.15wanjia.com/news/61093.html

相关文章:

  • wordpress短信插件seo引擎搜索入口
  • wordpress网站合并seo排名优化软件有用吗
  • 什么平台可以做网站上海培训机构排名
  • 做网站教材网站维护公司
  • 无锡网站建设选众鼎网站做成app
  • 交钱做网站对方拿了钱不做该怎么办十大流量平台
  • 更合网站设计制作独立站怎么建站
  • 网站中二级导航栏怎么做网上接单平台有哪些
  • 广州代办公司注册seo单页快速排名
  • 国内做的比较好的网站免费的网站域名查询565wcc
  • 汽车之家网址广州seo网络培训课程
  • 乌克兰网站服务器国内新闻大事20条
  • 做竞赛的平台或网站百度关键词点击工具
  • 日本做电子贺卡网站线上宣传渠道和宣传方式
  • 网络营销基本含义天津seo培训机构
  • 网站建设公司加盟网站诊断分析
  • 做网站怎么建文件夹百度引擎
  • 马鞍山市建设银行网站女孩子做运营是不是压力很大
  • 株洲网站建设网站运营最近新闻有哪些
  • 西安做网站报价搜索引擎营销的成功案例
  • 江苏建设网站企业网站制作方案
  • 自己如何做网站建设产品50个关键词
  • 微网站价格代发新闻稿的网站
  • ps做图游戏下载网站有哪些seo诊断
  • 深圳app网站网店营销
  • 环保网站可以做哪些内容seo二级目录
  • 云图片手机网站展示辽宁seo推广
  • 沈阳微信网站建设申请网站怎样申请
  • 敦化市住房和城乡建设局网站商业软文怎么写
  • 杭州网站开发培训免费建站模板