QT源码之Qt信号槽机制与事件机制的联系

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

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

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

  1. view plaincopy to clipboardprint?  
  2. if ((c->connectionType == Qt::AutoConnection     
  3.      && (currentThreadData != sender->d_func()->threadData     
  4.          || receiver->d_func()->threadData != sender->d_func()->threadData))     
  5.     || (c->connectionType == Qt::QueuedConnection)) {     
  6.     queued_activate(sender, signal, *c, argv);     
  7.     continue;     
  8. } else if (c->connectionType == Qt::BlockingQueuedConnection) {     
  9.     blocking_activate(sender, signal, *c, argv);     
  10.     continue;     
  11. }    
  12. if ((c->connectionType == Qt::AutoConnection  
  13.      && (currentThreadData != sender->d_func()->threadData  
  14.          || receiver->d_func()->threadData != sender->d_func()->threadData))  
  15.     || (c->connectionType == Qt::QueuedConnection)) {  
  16.     queued_activate(sender, signal, *c, argv);  
  17.     continue;  
  18. } else if (c->connectionType == Qt::BlockingQueuedConnection) {  
  19.     blocking_activate(sender, signal, *c, argv);  
  20.     continue;  
  21. }  

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

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

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

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

 

  1. 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信号槽机制与事件机制的联系的问题介绍完了,希望本文对你有帮助。

责任编辑:zhaolei 来源: CSDN博客
相关推荐

2011-06-09 09:45:35

Linux QT 信号

2011-06-23 13:38:27

QT 元对象 信号

2011-06-23 14:05:32

Qt 事件机制

2011-06-13 10:21:25

QT 信号 槽机制

2011-06-15 14:38:01

QT 信号

2011-07-05 18:32:52

QT 信号 机制

2011-07-05 18:40:19

QT 信号 机制

2021-12-23 15:07:40

QtC++编译程序

2011-07-01 14:14:34

Qt 事件

2011-07-01 14:20:59

Qt 事件

2011-06-09 17:26:17

Qt 插件 API

2011-07-01 15:04:49

Qt 内省

2023-10-07 08:21:35

PyQtPython

2011-06-20 15:40:19

QT 信号

2011-06-23 11:16:39

Qt Excel

2011-06-23 15:10:39

Qt 窗体

2011-06-28 15:47:13

Qt 信号

2011-06-22 17:09:50

QT 进程 通信

2011-06-23 15:32:05

Qt Windows消息

2011-06-29 17:20:20

Qt 内存 QOBJECT
点赞
收藏

51CTO技术栈公众号