Qt信号槽/使用问题

概述

nothing now

关于emit

最近在看一个Qt源码的时候,看人家发送信号的时候,没有使用emit,而是直接调用信号函数。然后在自己开发环境下试了下~不加emit果然也能成功,好惊讶,顺便比较了下是否加emit情况下生成的moc文件,结果完全一致。然后查了下emit的定义:#define emit (//既emit被定义成了空,仅仅是个标记符号)可能Qt开发者定义这个的目的是告诉程序猿你在使用信号而已。

链接方式

所谓的安全

所谓的安全,并不安全?!

今日笔记 - 未进行整理和测试

跨线程的 信号槽函数之间的链接

即使走按值传递,也依然可能发生线程冲突–

大家都知道函数参数按值传递时,会有一个拷贝的过程,这个拷贝过程,应该是发生在调用者线程中的。
当信号槽使用非阻塞式队列链接时,可能:在子线程第二次发送信号时,第一次的槽函数正在执行过程中。
而前后两次调用槽函数时,使用的是同一个形式参数的内存。

实际现象就是这样的,跨线程的信号槽队列链接,按值传递参数,依然会发生线程冲突问题。
也就是说,信号槽链接方式,仅仅是决定了槽函数的执行线程,但不保证线程安全。

方案1:
使用blockconnect

方案2:
按指针传递,并且加锁----
因为指针再信号槽的传递过程中没有锁不到的缝隙。

而按值传递,始终的存在一个锁不到的时间缝隙—

实际的信号槽中 带const&
但是在链接时,不带const& 不会报错 且会链接成功 难不成这会影响到传参形式

最终的测试结果时,无论如何,使用队列链接时,始终存在冲突—

只有使用队列链接时,才会显示正常—

此处也有肯时s_pThis获取或者hash遍历导致的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值