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

网站设计的逻辑结构合肥做app公司

网站设计的逻辑结构,合肥做app公司,网络推广软文是一种很好的推广方式,深圳网络推广培训中心基础概念 qt的下线程qthread,每个线程都有自己的事件循环exec。对象的线程上下文,每个对象都有自己的线程上下文,怎么理解呢,就是该对象在哪个线程创建,其线程上下文就是谁。每个qobject对象在创建时都有包含线程成员…

基础概念

  • qt的下线程qthread,每个线程都有自己的事件循环exec。
  • 对象的线程上下文,每个对象都有自己的线程上下文,怎么理解呢,就是该对象在哪个线程创建,其线程上下文就是谁。
  • 每个qobject对象在创建时都有包含线程成员,threaddata,该成员的类型是QThreadData,该成员与qobject对象的父对象保持一致,若父对象不存在,则取当前线程的值为该成员赋值,详见源码如下:
QObject::QObject(QObject *parent): d_ptr(new QObjectPrivate)
{Q_D(QObject);d->threadData = (parent && !parent->thread()) ? parent->d_func()->threadData : QThreadData::current();if (parent) {if (!check_parent_thread(parent, parent ? parent->d_func()->threadData : 0, d->threadData))parent = 0;setParent(parent);
}

 如上代码可以得出如下结论:

  • 当创建QObject时,在构造函数中会根据父对象的值进行赋值,规则是如果父对象存在,并且父对象下thread成员存在,则赋值给新创建的threadData成员;否则将当前多线程的线程数据赋值给该对象threadData成员。
void QObject::moveToThread(QThread *targetThread)
{Q_D(QObject);if (d->parent != 0) {qWarning("QObject::moveToThread: Cannot move objects with a parent");return;}if (d->isWidget) {qWarning("QObject::moveToThread: Widgets cannot be moved to a new thread");return;}QThreadData *currentData = QThreadData::current();QThreadData *targetData = targetThread ? QThreadData::get2(targetThread) : new QThreadData(0);if (d->threadData->thread == 0 && currentData == targetData) {// one exception to the rule: we allow moving objects with no thread affinity to the current threadcurrentData = d->threadData;} else if (d->threadData != currentData) {qWarning("QObject::moveToThread: Current thread (%p) is not the object's thread (%p)./n""Cannot move to target thread (%p)/n",currentData->thread, d->threadData->thread, targetData->thread);return;}
......

 通过如上代码可以看到movetothread的限制条件如下:

  1. 如果存在父对象,调用movetothread接口会失败,并提示“QObject::moveToThread: Cannot move objects with a parent
  2. 如果是该对象是QWidget或者其子类,不能调用movetothread,因为qwidget及其子类只能在主线程中。否则会产生“QObject::moveToThread: Widgets cannot be moved to a new thread”错误
  3. 如果要调用的movetothread的对象的线程上下文是一个线程A,要转移的线程B,如果在线程C中调用movetothread,那么会失败,只能在线程A调用movetothread接口。否则会产生“QObject::moveToThread: Current thread (%p) is not the object's thread (%p)./n"
                     "Cannot move to target thread (%p)
    ”错误。

movetothread的本质

个人理解:每个线程都有自己的事件循环,并不是一个程序只有一个事件循环,调用movetothread后,即将该对象相关的事件推送的到对应新线程的事件循环,新线程会将事件推送到对应对象的event方法进行分发处理。所以只有事件类型的才可以在新线程中执行(即只能通过信号槽机制来调用,因为跨线程信号槽机制会触发事件推送;在另外一个线程中通过函数调用的方式调用该对象的方法不会在新线程中执行,而是在调用线程执行)。

重点

movetothread是一种多线程的实现方式

对于事件驱动机制来说,例如“定时器”或者“网络”模块,他们只能在单一进程中使用,例如不能一个线程创建一个定时器,而在另外一个线程开始或者结束该定时器。这些操作都不可取。

http://www.yayakq.cn/news/17046/

相关文章:

  • wordpress文章页的三大标签佛山市seo推广哪家好
  • 网站设计与程序方向做一个平台网站的预算
  • 天猫的网站建设《设计》完整版
  • wordpress电商网站网络推广的平台
  • 如果你会建网站做营销型网站的公司
  • 人流什么时间做 新闻源网站中国建设银行网站评价
  • 提高网站排名的软件做ppt的网站兼职
  • 友汇网网站建设管理后台设置M97 网站建设网络公司整站源码
  • 模板堂网站源码做有奖竞猜网站违法吗
  • 江苏住房和城乡建设厅官方网站6辽宁省建设工程信息网业绩备案
  • 2018网站设计报价表河南网站备案
  • 成都网站建设-中国互联wordpress python代码
  • 室内设计设计师网站推荐佛山网络公司哪家最好
  • 3合1网站建设价格产品定制网站开发
  • 视觉中国网站建设公司淘气堡网站建设
  • dede网站地图插件建设部网站电话
  • 标志设计网站推荐网络推广app是干什么的
  • 茂名网站制作价格网站群建设的必要性
  • php做网站的重点e建网
  • 网站建设是固定资产还是列费用个人购物网站建设
  • 深圳做网站d公司好看的影视大全下载
  • 网站建设续费是什么费用什么样的网站可以做外链
  • 信用中国网站建设要求wordpress导航怎么添加连接
  • 购买网站空间的注意事项聊城做网站多少钱
  • 网站开发流程框架网站作品怎么做
  • wordpress本地搬家重庆seo按天收费
  • 想建设个人网站去那里建设四川住房建设网站
  • 百度seo怎么做网站内容优化网页设计教程网站
  • php怎么用来做网站动画专业大学排名
  • 青州住房和城乡建设网站专门做品牌折扣的网站有哪些