QCoreApplication类exec()方法分析

忙到现在才有时间做一些简单的代码分析,过不了多久就要睡觉了,又是忙碌的一天,每天如此,好像轻闲下来,但是真正闲下来的时候,又会去想着忙点多好。人就是这样,总是很难满足于现状。

今天,先对exec()函数的后半部分进行分析:

QEventLoop eventLoop;

self->d_func()->in_exec = true;

self->d_func()->aboutToQuitEmitted = false;

int returnCode = eventLoop.exec();

threadData->quitNow = false;

if (self) {

self->d_func()->in_exec = false;

if (!self->d_func()->aboutToQuitEmitted)

emit self->aboutToQuit();

self->d_func()->aboutToQuitEmitted = true;

sendPostedEvents(0, QEvent::DeferredDelete);

}

该方法在程序退出之前是不返回的,eventLoop.exec()的调用会让程序进入一个事件循环,直到程序结束。

进入QEventLoop中的exec方法:

Q_D(QEventLoop);

if (d->threadData->quitNow)

return -1;

if (d->inExec) {

qWarning("QEventLoop::exec: instance %p has already called exec()", this);

return -1;

}

d->inExec = true;

d->exit = false;

++d->threadData->loopLevel;

d->threadData->eventLoops.push(this);

首先将事件类对象压入线程结构体中。

// remove posted quit events when entering a new event loop

QCoreApplication *app = QCoreApplication::instance();

if (app && app->thread() == thread())

QCoreApplication::removePostedEvents(app, QEvent::Quit);

英文的注释说的已经很清楚了。

#if defined(QT_NO_EXCEPTIONS)

while (!d->exit)

processEvents(flags | WaitForMoreEvents | EventLoopExec);

#else

try {

while (!d->exit)

processEvents(flags | WaitForMoreEvents | EventLoopExec);

} catch (...) {

qWarning("Qt has caught an exception thrown from an event handler. Throwing/n"

"exceptions from an event handler is not supported in Qt. You must/n"

"reimplement QApplication::notify() and catch all exceptions there./n");

// copied from below

QEventLoop *eventLoop = d->threadData->eventLoops.pop();

Q_ASSERT_X(eventLoop == this, "QEventLoop::exec()", "internal error");

Q_UNUSED(eventLoop); // --release warning

d->inExec = false;

--d->threadData->loopLevel;

throw;

}

#endif

在此调用事件循环不同平台下的事件分派器的processEvent方法进行事件分析。

当出现异常时,将当前事件放弃掉。

// copied above

QEventLoop *eventLoop = d->threadData->eventLoops.pop();

Q_ASSERT_X(eventLoop == this, "QEventLoop::exec()", "internal error");

Q_UNUSED(eventLoop); // --release warning

d->inExec = false;

--d->threadData->loopLevel;

return d->returnCode;

在此,事件循环退出。

好了,今天就只能分析到这些,电脑快没电了,关于QApplication的分析,需要明天进行了。

2009年11月3日星期二 00:00

QCoreApplication类exec()方法分析相关推荐

  1. Java之美[从菜鸟到高手演练]之Arrays类及其方法分析

    作者:二青 个人站点:zhangerqing.cn    邮箱:xtfggef@gmail.com    微博:Sina Visitor System 本章主要介绍一下 java.util.Array ...

  2. python 动态_python实现动态创建类的方法分析

    本文实例讲述了python实现动态创建类的方法.分享给大家供大家参考,具体如下: python作为动态语言,如何在运行时动态创建类呢(python Creating classes dynamical ...

  3. Arrays类及其方法分析

    排序 Arrays.sort()方法,对于基本数据类型采用DualPivotQuicksort(多路快排)进行排序,对于引用类型的数组,采用MergeSort(归并排序)进行排序,下面我们分别来讲一下 ...

  4. Google Test(GTest)使用方法和源码解析——模板类测试技术分析和应用

    写C++难免会遇到模板问题,如果要针对一个模板类进行测试,似乎之前博文中介绍的方式只能傻乎乎的一个一个特化类型后再进行测试.其实GTest提供了两种测试模板类的方法,本文我们将介绍方法的使用,并分析其 ...

  5. java类和接口实例_Java定义泛型接口和类的方法实例分析

    本文实例讲述了Java定义泛型接口和类的方法.分享给大家供大家参考,具体如下: 一 点睛 所谓泛型:就是允许在定义类.接口指定类型形参,这个类型形参在将在声明变量.创建对象时确定(即传入实际的类型参数 ...

  6. java 非模态_Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/GoForwardToStep/arti ...

  7. Netty消息接收类故障案例分析

    <Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析Netty消息接收类故障案例.李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的同 ...

  8. KCF目标跟踪方法分析与总结

    KCF目标跟踪方法分析与总结 两个竖杠是什么数学符号    就是这个 | |  这个符号叫做范数,它事实上是由线性赋范空间到非负实数的映射 在线性赋范空间中,它可以表示空间中的点与原点间的距离,两点间 ...

  9. 从实体类get方法拿不到值,可能是字段带_的原因

    一.问题描述 从实体类get方法拿不到值,  二.分析与解决 可能是字段带_的原因: 例如: private String teacher_id 这样写的 ,然后如果在Controller 或serv ...

最新文章

  1. 超线程技术——超线程技术让(P4)处理器增加5%的裸晶面积,就可以换来15%~30%的效能提升,本质单核模拟双核!和异步编程的思想无异。...
  2. 启明云端WT32-CAM操作视频,让你快速上手ESP32camera应用
  3. mongodb创建用户名和密码_Python中使用MongoDB详解
  4. Sql Server 在数据库中所有表所有栏位 找出匹配某个值的脚本(转)
  5. dataBinding和retrofit的使用
  6. matlab 细化函数,MATLAB图像处理工具箱函数(细化篇).doc
  7. 【华为云技术分享】大数据容器化,头部玩家尝到了甜头
  8. 第八届蓝桥杯JavaB---承压计算
  9. 《计算机网络》简要学习笔记:未完自用
  10. 建立可扩展的silverlight 应用框架 step-3
  11. 金鱼的养殖知识大全(一)
  12. 解读Android12 CDD中针对隔离环境(TEE)的要求
  13. 老年手机英文改中文_老年手机设置成英文怎么办
  14. LINUX IIO子系统分析之五IIO BUFFER子模块实现分析
  15. 一加 Ace2是直屏还是曲面屏 一加 Ace2有IP68级防水吗
  16. 使用ffmpeg转换文件格式,及ffmpeg参数说明(转)
  17. 什么是静态网站生成器
  18. isis 网络 level 2 iih_ngspice实例介绍2--直流扫描分析
  19. Java Algorithm 简单算法
  20. 修改数据库表的某一字段长度

热门文章

  1. 一些简单的java,c程序
  2. 【转】使用Midjourney绘制小漫画
  3. VSTS 更名为 Azure DevOps
  4. nodejs学习consolidate
  5. uml大作业 零售业智能运营系统
  6. Lisa美语的创始人Lisa Mojsin博士的微信公众号
  7. fontforge制作自定义字体及在手机上应用举例
  8. eclipse theia_如何在Ubuntu 18.04上设置Eclipse Theia Cloud IDE平台
  9. keyshot怎么贴logo_KeyShot基础操作教程,如何复制和粘贴以及编辑材质
  10. 2021-2027全球与中国机械,电气和管道工程(MEP)服务市场现状及未来发展趋势