首页 > 其他分享 >Qt 信号槽连接方式

Qt 信号槽连接方式

时间:2024-05-13 19:41:56浏览次数:22  
标签:index QMetaCallEvent sender signal argv 信号 连接 Qt

Qt的使用这个函数处理信号

void QMetaObject::activate(QObject *sender, int signalOffset, int local_signal_index, void **argv)

 

多线程情况下:

直连或者队列连接使用  queued_activate()处理:

阻塞连接(BlockingQueuedConnection)相同线程直接调用,
不同线程使用 事件处理:

                QMetaCallEvent *ev = c->isSlotObject ?

 

                    new QMetaCallEvent(c->slotObj, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore) :

 

                    new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore);

 

                QCoreApplication::postEvent(receiver, ev);

 


if ((c->connectionType == Qt::AutoConnection && !receiverInSameThread)

                || (c->connectionType == Qt::QueuedConnection)) {

 

                queued_activate(sender, signal_index, c, argv ? argv : empty_argv, locker);

 

                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;

 

                QMetaCallEvent *ev = c->isSlotObject ?

 

                    new QMetaCallEvent(c->slotObj, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore) :

 

                    new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal_index, 0, 0, argv ? argv : empty_argv, &semaphore);

 

                QCoreApplication::postEvent(receiver, ev);

 

                locker.unlock();

 

                semaphore.acquire();

 

                locker.relock();

 

                continue;

 

#endif

 

}
在 static void queued_activate(QObject *sender, int signal, QObjectPrivate::Connection *c, void **argv,
                            QMutexLocker &locker)函数中:也是使用 事件进行处理:

QMetaCallEvent *ev = c->isSlotObject ?

        new QMetaCallEvent(c->slotObj, sender, signal, nargs, types, args) :

 

        new QMetaCallEvent(c->method_offset, c->method_relative, c->callFunction, sender, signal, nargs, types, args);

 

    QCoreApplication::postEvent(c->receiver, ev);

 

 

 

标签:index,QMetaCallEvent,sender,signal,argv,信号,连接,Qt
From: https://www.cnblogs.com/wish-sleeping/p/18189855

相关文章

  • 本地SSH方式连接实例
    通过SSH登录GPUMALL实例介绍通过SSH方式连接到Linux服务器的方法有多种,这里介绍几种常用的SSH远程登录工具,只需要使用其中一种可以登录到GpuMall实例即可。立即免费体验:https://gpumall.com/login?type=register&source=cnblogsWindows系统可以使用:XShell、Mobaxterm、......
  • 开发工具连接实例远程开发
    远程开发主要基于将开发环境(包括代码编辑、编译、运行等)从本地机器转移到远程服务器上,这个过程涉及几个关键组件和概念:立即免费体验:https://gpumall.com/login?type=register&source=cnblogs1.远程服务器远程服务器是托管远程开发环境的中心,可以是一个物理服务器,也可以是云中的......
  • 开发工具连接实例远程开发
    远程开发主要基于将开发环境(包括代码编辑、编译、运行等)从本地机器转移到远程服务器上,这个过程涉及几个关键组件和概念:立即免费体验:https://gpumall.com/login?type=register&source=cnblogs1.远程服务器远程服务器是托管远程开发环境的中心,可以是一个物理服务器,也可以是云中的......
  • 采用双dsPIC DSC内核配置,DSPIC33CH128MP208-E/PT DSPIC33CH128MP208-I/PT DSPIC33CH12
    dsPIC33CH系列数字信号控制器简介dsPIC33CH系列控制器采用单芯片、双dsPICDSC内核配置,将为设计高端嵌入式控制应用的系统开发人员带来福音。根据设计,dsPIC33CH的两个内核一个是主核,一个是副核。副核用于执行时间关键型专用控制代码,主核负责运行用户接口、系统监控和通信功能,专为......
  • openGauss 检查应用连接数
    检查应用连接数如果应用程序与数据库的连接数超过最大值,则新的连接无法建立。建议每天检查连接数,及时释放空闲的连接或者增加最大连接数。操作步骤以操作系统用户omm登录数据库主节点。使用如下命令连接数据库。gsql-dpostgres-p8000postgres为需要连接的数据库名......
  • dbeaver连接mysql报错Public Key Retrieval is not allowed
    这个错误通常发生在尝试通过JDBC连接MySQL数据库时,并且是由于MySQL的配置不允许公钥检索导致的。从MySQL5.0开始,连接时默认需要使用密钥进行密码加密传输。如果JDBC驱动程序尝试通过不允许公钥检索的方式进行连接,就会抛出这个错误。解决方法:更新JDBC连接字符串,添加允许公钥检......
  • [LeetCode] 1584.连接所有点的最小费用 Kruskal And Prim 算法 Java 并查集
    Problem:1584.连接所有点的最小费用目录Kruskal算法复杂度CodePrim算法复杂度CodeKruskal算法复杂度时间复杂度:添加时间复杂度,示例:$O(mlog(m))$空间复杂度:添加空间复杂度,示例:$O(n)$CodeclassSolution{publicintminCostConnectPoints(int[][]po......
  • Qt的QListWidget清空内容出现段错误
    1问题描述在使用Qt中的QListWidget控件的时候想要刷新其中的内容执行清空操作的时候出现“段错误(核心已转储)”。出现这个问题的具体原因看很多人分析是因为在执行清空前QListWidget控件已经connet到槽函数,所以在clear的时候就会出现段错误,具体的原因这里也不做太多分析。2......
  • 日常Bug排查-连接突然全部关闭
    日常Bug排查-连接突然全部关闭前言日常Bug排查系列都是一些简单Bug的排查。笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材。Bug现场最近碰到一个问题,一台机器上的连接数在达到一定连接数(大概4.5W)连接数之后会突然急速下降到几百。在应用上的表现就是大量的连接报......
  • QT: Expression:c >= -1 && c <= 255
    报错内容分析错误注意看报错位置位于isctype.cpp文件的Line:36我们打开isctype.cpp,其36行内容如下extern"C"int__cdecl_chvalidator(intconstc,intconstmask){_ASSERTE(c>=-1&&c<=255);return_chvalidator_l(nullptr,c,mask);}主要是第3行:_......