Qt分析-信号槽函机制

mac2024-07-21  88

概述

nothing now

关于emit

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

链接方式

所谓的安全

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

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

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

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

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

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

方案1: 使用blockconnect

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

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

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

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

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

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

最新回复(0)