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

上海企乐网站制作公司wordpress注册邮箱后缀

上海企乐网站制作公司,wordpress注册邮箱后缀,企业管理六大体系,平面设计网站编辑招聘先说重点#xff0c;先了解几个重要的概念#xff0c; 事件调度器#xff0c;该调度器的具体实现与操作系统相关#xff0c;不同的操作系统具有不同的实现#xff0c;例如linux系统下该调度器的实现为QEventDispatcherUNIX#xff0c;而window下的他们的实现为QEventDis…先说重点先了解几个重要的概念 事件调度器该调度器的具体实现与操作系统相关不同的操作系统具有不同的实现例如linux系统下该调度器的实现为QEventDispatcherUNIX而window下的他们的实现为QEventDispatcherWin32他们的目录是QTDIR/5.15.2/Src/qtbase/src/corelib/kernel目录下寻找即可。该调度器实现了事件循环的核心功能。不同操作系统的事件调度器他们的基类是同一个QAbstractEventDispatcher。threadData这里就称它为线程数据吧每个QObject都有这样一个数据成员从这里可以看出每个QObject对象都是线程相关的。threadData包含了该对象所属线程的相关信息其中包含了该线程的事件队列等该数据成员可以通过qobject::movetoThread来实现转移。每个线程可以启动多个事件循环QEventLoop但是所有的QEventLoop共享同一个事件调度器所以在一个线程中即使启动多个事件最终的事件循环中的事件调度器是同一个。事件循环的主要功能我自身的理解是遍历本线程的事件队列将消息队列中的事件发送到对应对象进行处理该事件队列的消息可以是用户发送的自定义是事件也可以是定时器事件也可以是对象删除删除也可以是操作系统的发出的一些消息转换而来的事件例如按钮的点击操作等。事件队列中存在事件压缩的概念压缩的概念是将事件队列中相同事件id比如定时器事件做相同事情的事件压缩为1个事件。 话不多说直接上源码清晰的将事件循环与线程的关系通过代码的方式展现出来 主线程的事件循环是由下面的代码触发 QCoreApplication::exec() exec的内部实现如下 int QCoreApplication::exec() { ...QEventLoop eventLoop;int returnCode eventLoop.exec(); ...return returnCode; } 通过上面的代码可以看到定义了一个QEventLoop对象对该对象调用了exec方法。QEventLoop的exec简要实现如下 int QEventLoop::exec(ProcessEventsFlags flags) {Q_D(QEventLoop); ...while (!d-exit)processEvents(flags | WaitForMoreEvents | EventLoopExec); ...return d-returnCode; }由上可以看出QEventLoop下的exec调用了processEvents方法。该方法的实现如下 bool QEventLoop::processEvents(ProcessEventsFlags flags) {Q_D(QEventLoop);if (!d-threadData-eventDispatcher)return false;if (flags DeferredDeletion)QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete);return d-threadData-eventDispatcher-processEvents(flags); }由上可以看到在processEvent的实现中首先判断了threadData中成员eventDispathcer是否存在若不存在则返回falseeventDispatcher从字面意思理解是一个事件分发器通过该对象指针调用其方法processEvents到这里会有一个疑问eventDispatcher是何时创建的呢请看下面的代码 QEventLoop::QEventLoop(QObject *parent): QObject(*new QEventLoopPrivate, parent) {Q_D(QEventLoop);if (!QCoreApplication::instance() QCoreApplicationPrivate::threadRequiresCoreApplication()) {qWarning( QEventLoop: Cannot be used without QApplication);} else {d-threadData.loadRelaxed()-ensureEventDispatcher();} } QAbstractEventDispatcher *QThreadPrivate::createEventDispatcher(QThreadData *data) {Q_UNUSED(data); #if defined(Q_OS_DARWIN)bool ok false;int value qEnvironmentVariableIntValue(QT_EVENT_DISPATCHER_CORE_FOUNDATION, ok);if (ok value 0)return new QEventDispatcherCoreFoundation;elsereturn new QEventDispatcherUNIX; #elif !defined(QT_NO_GLIB)const bool isQtMainThread data-thread.loadAcquire() QCoreApplicationPrivate::mainThread();if (qEnvironmentVariableIsEmpty( QT_NO_GLIB) (isQtMainThread || qEnvironmentVariableIsEmpty( QT_NO_THREADED_GLIB)) QEventDispatcherGlib::versionSupported())return new QEventDispatcherGlib;elsereturn new QEventDispatcherUNIX; #elsereturn new QEventDispatcherUNIX; #endif } 可以看到eventDispatcher是在QEventLoop对象构造的过程中创建的注意在这里生成的eventDispatcher已经是QEventDispatcherUnix类型了。下一步就是列出事件调度器的核心实现了这里以linux为里介绍所以QEventDispatcherUNIX下的实现processEvents实现源码如下所示 bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags) {Q_D(QEventDispatcherUNIX);……QCoreApplicationPrivate::sendPostedEvents(0, 0, d-threadData);……timespec *tm nullptr;……d-pollfds.append(d-threadPipe.prepare());int nevents 0;switch (qt_safe_poll(d-pollfds.data(), d-pollfds.size(), tm)) {……}return (nevents 0); }void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type,QThreadData *data) {……while (i data-postEventList.size()) {……const QPostEvent pe data-postEventList.at(i);i;……QEvent *e pe.event;QObject * r pe.receiver;……QCoreApplication::sendEvent(r, e);}…… }通过上面的代码可以看出在事件调度器里面的processEvents实现中首先调用sendPostedEvents方法将事件队列中的事件通过QCoreApplication::sendEvent调用发送给对应的对象这里简要的提一下sendevent方法是一个阻塞型的方法调用仅用于本线程内的调用他的内部内部核心实现是函数调用即通过接收对象receiver的指针调用该对象的event方法但是需要注意的是在调用event方法之前首先要调用该对象注册的事件监听器对象eventfilter方法。我会单独列出一个文章讲解sendevent详细实现将在里面实现。 然后后调用了poll相关的方法里面射击了threadPipe的相关用法我通过查看资料了解到的是下面的实现会导致该循环让出cpu等待事件队列中有属于再进行工作这一块我需要再研究下后续补充。 总结 至此我们了解了一个事件循环的本质及与事件循环与线程的关系 事件循环与线程密不可分虽然在一个线程中可以启动多个事件循环但是这些事件循环共享同一个threadData也就是说在一个线程内无论启动多少个事件循环他们操作的是都是同一个事件调度器并不会因为启动多个事件队列而导致别的事件队列无法接收数据。事件循环的本质就是将事件队列中的事件一一发送到本线程中的各个对象中进行处理每个QObject对象都是线程相关的每个QObject对象都存在一个threadData成员这个成员包含了这个对象所属的线程信息
http://www.hkea.cn/news/14453243/

相关文章:

  • qq空间做淘宝客网站做直播网站需要那些技术
  • 丹东建设银行网站大作设计网站作品
  • 山东前十名建筑设计院网络优化工程师面试题
  • 织梦 网站公告站酷网官网入口
  • 凤翔网站开发网站后台如何用代码上传视频
  • 用于手机的导航网站要怎么做北京注册公司最低注册资金
  • 五常网站建设wordpress橱窗插件
  • 网站搭建策略与方法舆情监控系统
  • 做网站容易吗网站设计时多页面切换时什么控件
  • 网站建设外包平台百度seo是什么意思
  • 北京城建一建设发展有限公司网站php采集wordpress文章
  • 网站策划 ppt上海市公共资源交易平台
  • 网站建设能挣钱吗网站建站公司哪家好
  • 网站建设外包服务管理情况flash网站建设公司
  • 西安商城网站wordpress后台无法访问
  • 北京市住房城乡建设门户网站公司网站域名申请
  • 云主机怎样做网站企业做推广可以发哪些网站
  • 哪家公司网站建设好这是我自己做的网站
  • 有哪些网站主页做的比较好看怎样做吧网站排名做上去
  • 台州外贸网站怎么做网站卖产品
  • 苍南县住房和城乡规划建设局网站做购物类网站有哪些
  • 商丘网站建设有限公司做校园网站的公司
  • 重庆农村网站建设wordpress 简洁模板
  • json做网站如何用wordpress搭建企业网站
  • 港口备案怎么在网站做湖南网站建设kaodezhu
  • 毕业设计做网站哪种好网站访问量怎么增加
  • 网站建设不用虚拟主机建筑公司网站电工
  • 中国电力建设股份有限公司网站协会网站建设的作用
  • 公司网站建设工作总结lnmp wordpress lamp
  • 网站换新域名商城类网站如何做seo