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

做淘客网站的网站自己备案

做淘客网站的,网站自己备案,中关村手机排行榜,北仑建设局网站Qt 信号和槽执行线程问题 1.QObject的thread() 函数 在Qt中QObject有一个thread() 的函数。这就说明#xff0c;每一个QOject对象都有所属的线程。 注意#xff1a; QThread也是一个QObject的子类#xff0c;也有自己所在的线程每个QObject存在父子关系#xff0c;存在…Qt 信号和槽执行线程问题 1.QObject的thread() 函数 在Qt中QObject有一个thread() 的函数。这就说明每一个QOject对象都有所属的线程。 注意 QThread也是一个QObject的子类也有自己所在的线程每个QObject存在父子关系存在父子关系的两个对象必须在同一个线程中 对于信号和槽的连接这里涉及到几个对象的thread sender()receiver()emit 线程 2.信号和槽的连接方式 1. Qt::AutoConnection Qt::AutoConnection是默认连接类型。如果信号接收方与发送方在同一个线程它将使用Qt::DirectConnection否则使用Qt::QueuedConnection。连接类型在信号发射时决定。 这时细心的你 好奇这里连接类型确定为啥不是在连接的时候确定而是在信号发射的时候确定的呢 2. Qt::DirectConnection Qt::DirectConnection将导致信号所连接的槽函数立即在发射信号的线程中执行。这意味着槽函数的执行与信号的发射是同步的。如果槽函数执行耗时操作或信号由UI线程发射可能会导致UI无响应。 3. Qt::QueuedConnection Qt::QueuedConnection将导致槽函数在接收者所在的线程中执行。这种连接方式下如果信号被多次触发相应的槽函数会按照顺序在接收者线程中依次执行。注意使用QueuedConnection时参数类型必须是Qt基本类型或者使用qRegisterMetaType()进行注册的自定义类型。 这也就是对我们说如果槽函数想在另一个线程执行把接受者的thread改到另一个线程即可 moveToThread()函数可以做到。 4.Qt::BlockingQueuedConnection Qt::BlockingQueuedConnection与Qt::QueuedConnection类似区别在于发送信号的线程在槽函数执行完毕之前会一直处于阻塞状态。因此发送方和接收方必须处于不同的线程否则可能导致死锁。 5.Qt::UniqueConnection Qt::UniqueConnection可以与以上所有连接类型搭配使用。一旦设置了Qt::UniqueConnection同一信号与同一槽函数的二次连接将会失败确保了连接的唯一性。 3.信号和槽的执行 (1) 信号执行所在的线程 这个毫无疑问这个调用emit信号函数的线程。对信号也就是个函数。 (2)发送者的thread() 这个就是发送者的对象所依附的线程 (3)槽函数执行所造的线程 这个是根据上方连接方式确定的 (4)接受者的thread() 这个就是发送者的对象所依附的线程 显然我们对于(1)(2)(4)的线程我们很容易确定。唯一不能确定的是槽函数所在的线程。要测试槽函数所在的线程其实很简单打印线程id就可以了关键是要想清楚上述几个线程即可写个代码验证即可 注意信号发射的线程可以和发送者的不在一个线程 多读几次上面加粗部分的提示相信你也可以想明白信号和槽执行的线程问题 4.简单原理简介 主要原理这里简单介绍一下下次会有更详细的源码分析。 直连和唯一连接很好实现主要是队列连接和阻塞连接不好理解。 这里要了解一下QThread和QEventLoop。 QThread中run()的默认实现调用了exec()从而创建一个QEventLoop对象由QEventLoop对象处理线程中事件队列每一个线程都有一个属于自己的事件队列并且线程安全中的事件。exec()在其内部不断做着循环遍历事件队列的工作。 QThread默认start是开启一个线程调用run() 函数进入事件循环然后将对象移动到到其他线程后。发射信号则根据连接类型进行不同的处理。队列连接是往接受者的线程post一个事件阻塞连接则是send发送一个事件。Qt源码中是采用QMetaCallEvent事件间接去触发的以避免子线程未启动的情况。 1以下是源码 /*!The starting point for the thread. After calling start(), thenewly created thread calls this function. The defaultimplementation simply calls exec().You can reimplement this function to facilitate advanced threadmanagement. Returning from this method will end the execution ofthe thread.\sa start(), wait() */ void QThread::run() {(void) exec(); }/*!Enters the event loop and waits until exit() is called, returning the valuethat was passed to exit(). The value returned is 0 if exit() is called viaquit().This function is meant to be called from within run(). It is necessary tocall this function to start event handling.\sa quit(), exit() */ int QThread::exec() {Q_D(QThread);QMutexLocker locker(d-mutex);d-data-quitNow false;if (d-exited) {d-exited false;return d-returnCode;}locker.unlock();QEventLoop eventLoop;int returnCode eventLoop.exec();locker.relock();d-exited false;d-returnCode -1;return returnCode; }2activate函数对于线程的判断 Qt::HANDLE currentThreadId QThread::currentThreadId(); // 发送线程idbool inSenderThread currentThreadId QObjectPrivate::get(sender)-threadData-threadId.loadRelaxed(); // 发送者线程id// We need to check against the highest connection id to ensure that signals added// during the signal emission are not emitted in this emission.uint highestConnectionId connections-currentConnectionId.loadRelaxed();do {QObjectPrivate::Connection *c list-first.loadRelaxed();if (!c)continue;do {QObject * const receiver c-receiver.loadRelaxed();if (!receiver)continue;QThreadData *td c-receiverThreadData.loadRelaxed(); // 接收者线程idif (!td)continue;bool receiverInSameThread;if (inSenderThread) {receiverInSameThread currentThreadId td-threadId.loadRelaxed();} else {// need to lock before reading the threadId, because moveToThread() could interfereQMutexLocker lock(signalSlotLock(receiver));receiverInSameThread currentThreadId td-threadId.loadRelaxed();}}while(..);}while(..);3执行槽函数判断 // determine if this connection should be sent immediately or// put into the event queueif ((c-connectionType Qt::AutoConnection !receiverInSameThread)|| (c-connectionType Qt::QueuedConnection)) {queued_activate(sender, signal_index, c, argv);continue; #if QT_CONFIG(thread)} else if (c-connectionType Qt::BlockingQueuedConnection) {if (receiverInSameThread) {qWarning(Qt: Dead lock detected while activating a BlockingQueuedConnection: Sender is %s(%p), receiver is %s(%p),sender-metaObject()-className(), sender,receiver-metaObject()-className(), receiver);}QSemaphore semaphore;{QBasicMutexLocker locker(signalSlotLock(sender));if (!c-receiver.loadAcquire())continue;QMetaCallEvent *ev c-isSlotObject ?new QMetaCallEvent(c-slotObj, sender, signal_index, argv, semaphore) :new QMetaCallEvent(c-method_offset, c-method_relative, c-callFunction,sender, signal_index, argv, semaphore);QCoreApplication::postEvent(receiver, ev);}semaphore.acquire();continue; #endif}5.结论 槽函数执行的线程根据接收者所在线程和连接方式对象的所依附的线程取决于父对象和所创建的线程 注意 要moveToThread时候千万不要指定父对象否则移动不过去移动到的线程必须start才能真正在其线程执行QThread本身也是QObject指定父对象后自己的thread()不是自己
http://www.zqtcl.cn/news/519267/

相关文章:

  • 服装网站建设建议域名注册最好的网站
  • 小游戏网站网络营销推广岗位
  • 做一百度网站保健品网站建设案例
  • 沙田镇仿做网站如何建设钓鱼网站
  • 如何用域名进网站企业做电商网站有哪些
  • soho做网站网站的k线图怎么做
  • 成都专业的网站建设公司做网站需要哪个专业
  • php彩票网站建设源码有人看片吗免费观看
  • 自己做网站的准备工作营销平台推广
  • 建站网站平台建站工具的优点
  • 各学院二级网站建设通报wordpress 修改admin
  • 网站建设加推广需要多少钱wordpress标签自动生成插件下载
  • 周村区建设局网站石家庄网站运营公司
  • 网站描述怎么设置wordpress仿模板
  • 宁波市网站建设公司h5游戏是什么意思
  • 青岛网站设计案例全栈网站开发
  • 欢迎访问中国建设银行网站个人客户网站建设需要经历什么步骤
  • 建设银行怀柔支行营业部网站企业官网手机版
  • cms那个做网站最好大连网站开发平台
  • 佛山建设外贸网站公司可信网站图标
  • 沈阳.....网站设计连云港优化网站团队
  • 网站添加白名单想学ui设计从哪里入手
  • 做期货与做网站的关系淮安市城市建设档案馆网站
  • 网站建设的技术亮点单位宣传册设计样本
  • 网站建设与维护服务敦化市建设局网站
  • 官方网站建设思路wordpress改成织梦
  • 网站建设推广方法网站调优
  • 苏州做企业网站wordpress前台发布文章
  • 怎么建个私人网站网络营销就业前景和薪水
  • 专业的网站开发团队京东电商平台