首页 > 其他分享 >Qt::BlockingQueuedConnection 与 QMetaCallEvent

Qt::BlockingQueuedConnection 与 QMetaCallEvent

时间:2024-09-18 18:01:31浏览次数:7  
标签:QMetaCallEvent Qt signal BlockingQueuedConnection 线程 receiver event sender

Qt 创建连接类型如果是 Qt::BlockingQueuedConnection,即sender thread 与 receiver thread 不同,
但是要求 sender signal 与 receiver slot 执行是 不同线程间的同步行为。也即:在sender signal 发出后 sender线程 要 等待
receiver 线程的 slot 执行完后才能继续 向后执行指令。

该种方式sender与receiver的参数传递并未通过堆上内存的方式进行。而是receiver直接操作sender线程浅上的内存完成的。
因为sender线程处于同步等待状态,函数帧并未返回上一级函数调用者,因此sender的signal 函数桟帧数据处于有效状态。
又因为sender和receiver属于同一个进程,因此可以直接通过指针获取sender 线程调用栈中的内存数据

实现方式:


QSemaphore semaphore;
{
QMutexLocker locker(signalSlotLock(receiver));
if (!c->isSingleShot && !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();

使用信号量在线程间进行同步,当QMetaCallEvent 在 receiver 线程EventLoop 处理完成后 会通过
void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type,
QThreadData *data)
{
...........
...........
QScopedPointer event_deleter(e); // will delete the event (with the mutex unlocked)

QCoreApplication::sendEvent(r, e);  // after all that work, it's time to deliver the event.
...........

...........
}

标签:QMetaCallEvent,Qt,signal,BlockingQueuedConnection,线程,receiver,event,sender
From: https://www.cnblogs.com/DesertCactus/p/18419039

相关文章

  • PyQt5 使用 QStackedWidget 实现轮播展示动画(自动与手动)
    PyQt5使用QStackedWidget实现轮播展示动画(自动与手动)在PyQt5中,如果需要用QStackedWidget展示图片比较生硬,参考网络上的一些内容,发现用QPropertyAnimation属性动画可实现想要的效果,于是记录在这里代码结构本文中全部代码全在test_QStackedWidget_Animation.py这一个文件中......
  • Qt Create多核编译配置
    随着qt项目的不断增大,项目编译的速度就越来越慢了,那么怎么解决编译项目慢的问题的呢?方法有二。方法1:该方法修改只对该项目有效。在Makearguments:填写-j4表示CPU使用4个核进行代码编译。方法2:该方法可以使用于所有项目编译。在Qtcreate的菜单栏点击"工具"--->"选项"-......
  • Qt 事件处理
    classQtWidgetsApplication1:publicQMainWindow{Q_OBJECTpublic:QtWidgetsApplication1(QWidget*parent=nullptr);~QtWidgetsApplication1();private:Ui::QtWidgetsApplication1Classui;publicslots:voidchangelabel();};QtWi......
  • PyQt / PySide + Pywin32 + ctypes 自定义标题栏窗口 + 完全还原 Windows 原生窗口边
    项目地址:GitHub-github201014/PyQt-NativeWindow:AclassofwindowincludenativeEvent,usePySideorPyQtandPywin32andctypesAclassofwindowincludenativeEvent,usePySideorPyQtandPywin32andctypes-github201014/PyQt-NativeWindowhttps://githu......
  • MQTT mosquitto, centos mosquitto[24330]: 1726226300: Socket error on client <unk
    Sep1319:18:20VM-8-12-centosmosquitto[24330]:1726226300:Socketerroronclient<unknown>,disconnecting.报错解释:这个错误来自于在CentOS系统上运行的MosquittoMQTT代理。错误信息表明客户端在尝试与Mosquitto通信时遇到了套接字错误(Socketerror),错误后面的数字可能是......
  • Qt 模型视图(四):代理类QAbstractItemDelegate
    文章目录Qt模型视图(四):代理类`QAbstractItemDelegate`1.基本概念1.1.使用现有代理1.2.一个简单的代理2.提供编辑器3.向模型提交数据4.更新编辑器的几何图形5.编辑提示Qt模型视图(四):代理类QAbstractItemDelegate​模型/视图结构是一种将数据存储和界面展示分......
  • Qt加载天地图离线api开发包/从官网趴地图js代码/费了九牛二虎之力终于搞定
    一、前言说明网上关于如何趴天地图离线api文件的文章,只有少量的两三篇,而且几乎没有说全和说对,搞得评论也是一片懵逼,这里不行那你不行,思路可以借鉴就是。索性花了点时间,自己研究了如何从官网一步步趴下来js文件,最终所有离线能使用的功能全部搞定,也根本不会有http等访问的情况出现,......
  • Qt:实现单例模式
    前言记录一下。正文单例模式根据实现方式和应用场景在Qt中可以分为以下几种类型:1.懒汉式单例懒汉式单例在第一次使用时才创建实例,延迟了对象的初始化。懒汉式单例分为线程安全和线程不安全两种实现方式。线程不安全的懒汉式单例:在第一次调用getInstance()时创建......
  • Qt Metadata
    1.codeclassGranPa:publicQObject{Q_OBJECTpublic:explicitGranPa(QObject*parent=nullptr);signals:voidgran_siga();voidgran_sigb();voidgran_sigc();publicslots:voidgran_slota();voidgran_slotb();voidgran_slotc();};GranPa::GranPa(QOb......
  • 快速入门 QT5 C++基础
    1.QT5中文显示乱码方法一:system("chcp65001");//放在主函数中方法二:首先引入库  #include"windows.h"再在主函数中写 SetConsoleOutputCP(CP_UTF8);2.什么是类,如何创建一个类#include<iostream>#include"windows.h"usingnamespacestd;classDog{/......