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机制的传递是利用消息队列,所以说是线程安全的。

转载于:https://my.oschina.net/xushizhe/blog/318938

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值