zoukankan      html  css  js  c++  java
  • QT源码之Qt信号槽机制与事件机制的联系

    QT源码之Qt信号槽机制与事件机制的联系是本文要介绍的内容,通过解决一个问题,从中分析出的理论,先来看内容。

    本文就是来解决一个问题,就是当signal和slot的连接为Qt::QueuedConnection,这时候这个连接是怎么分发处理的。下面就结合一下Qt的源代码来分析一下

    view plaincopy to clipboardprint?  
    if ((c->connectionType == Qt::AutoConnection     
         && (currentThreadData != sender->d_func()->threadData     
             || receiver->d_func()->threadData != sender->d_func()->threadData))     
        || (c->connectionType == Qt::QueuedConnection)) {     
        queued_activate(sender, signal, *c, argv);     
        continue;     
    } else if (c->connectionType == Qt::BlockingQueuedConnection) {     
        blocking_activate(sender, signal, *c, argv);     
        continue;     
    }    
    if ((c->connectionType == Qt::AutoConnection  
         && (currentThreadData != sender->d_func()->threadData  
             || receiver->d_func()->threadData != sender->d_func()->threadData))  
        || (c->connectionType == Qt::QueuedConnection)) {  
        queued_activate(sender, signal, *c, argv);  
        continue;  
    } else if (c->connectionType == Qt::BlockingQueuedConnection) {  
        blocking_activate(sender, signal, *c, argv);  
        continue;  
    }  

    这段代码的意思是:当前connectionType为Qt::AutoConnection并且,signal和slot不在一个线程或者是signal和不再当前线程中;或者是c->connectionType为 Qt::QueuedConnection这时候调用函数

    queued_activate,如果c->connectionType 为Qt::BlockingQueuedConnection则调用函数blocking_activate

    我们当queued_activate和blocking_activate一样就可以了。

    queued_activate函数很简单,就是对参数转换一下,然后调用  

    QCoreApplication::postEvent(c.receiver, new QMetaCallEvent(c.method,sender,signal,nargs,types,args,semaphore)); 

    注意: postEvent第二个参数是QMetaCallEvent。这样这个signal-slot的connection就发送到receiver的消息队列中去了。

    接下来消息队列如何处理QMetaCallEvent,请参考QT源码解析剖析Qt事件机制原理(详解 QT 源码之 Qt 事件机制原理

    后记:通过这种方法Qt实现了跨线程的signal-slot传递,并且这种signal-slot机制的传递是利用消息队列,所以说是线程安全的。

    小结:关于QT源码之Qt信号槽机制与事件机制的联系的问题介绍完了,希望本文对你有帮助。

  • 相关阅读:
    sql 一对多变成一对多的最后一条记录的做法
    2.如何优化操作大数据量数据库(改善SQL语句)
    asp数据操作类DB
    4.如何优化操作大数据量数据库(几十万以上数据)(如何选择聚合索引)
    【转】asp中记录集对象的getrows和getstring用法
    用DB类写新闻系统1
    Apache+Tomcat配置负载均衡
    C# CAD 几何图形周围创建尽可能小的圆 使用 .NET 在 2D AutoCAD
    C# Cad 2007 工具栏 工具条创建
    C# Cad 拉伸 关键 GetStretchPoints MoveStretchPointsAt
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/9615205.html
Copyright © 2011-2022 走看看