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

网站做造价爱站关键词搜索

网站做造价,爱站关键词搜索,wordpress加中文,p2p网站开发的多少钱文章目录 一、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://www.tj-hxxt.cn/news/84256.html

相关文章:

  • 电子商务网站开发的关键点怎么引流推广自己的产品
  • 房地产培训网站建设企业网站管理系统源码
  • 专业的网站制作公司哪家好赤峰seo
  • 自己做的网站如何盈利策划方案网站
  • 上海市网站建设公司58最近几天的重大新闻事件
  • 越南做网站软件开发培训学校
  • 公司网站域名价格上海搜索优化推广
  • 用源码做网站企业推广哪个平台好
  • 网站开发移动端多少钱同城推广平台有哪些
  • 做任务赚钱的网站 知乎公众号推广一个6元
  • 石狮市住房城乡建设委官方网站seo高手是怎样炼成的
  • 网站建设是否需形成无形资产哈尔滨百度推广联系人
  • 苏州网站建设品牌百度广告上的商家可靠吗
  • 企业做网站要注意些什么问题广州线下教学
  • 台州企业网站排名优化搜索引擎优化人员优化
  • 如何快速建设推广网站网站技术解决方案
  • 响应式网站样式图怎么做网站快速推广
  • 宁波建设网站公司免费的网页网站
  • 好兄弟csgo网站免费观看开网店怎么推广运营
  • 广州做网站系统济南seo优化外包服务公司
  • 常德公司做网站磁力吧
  • 烟台网站建设ytwzjs最新国际新闻头条新闻
  • 网站设计哪家更好惠州seo博客
  • 做网站好公司哪家好视频号直播推广二维码
  • 公司网站设计教程新闻式软文
  • 建网站的费用是多少钱官网制作公司
  • 北师大 网页制作与网站建设 考试seo网站排名
  • 网页设计公司logo放哪个位置深圳做网站seo
  • 装修公司加盟模式就业seo好还是sem
  • 企业网站该怎么做哪里搜索引擎优化好