概述
nothing now
关于emit
最近在看一个Qt源码的时候,看人家发送信号的时候,没有使用emit,而是直接调用信号函数。然后在自己开发环境下试了下~不加emit果然也能成功,好惊讶,顺便比较了下是否加emit情况下生成的moc文件,结果完全一致。然后查了下emit的定义:#define emit (//既emit被定义成了空,仅仅是个标记符号)可能Qt开发者定义这个的目的是告诉程序猿你在使用信号而已。
链接方式
所谓的安全
所谓的安全,并不安全?!
今日笔记 - 未进行整理和测试
跨线程的 信号槽函数之间的链接
即使走按值传递,也依然可能发生线程冲突–
大家都知道函数参数按值传递时,会有一个拷贝的过程,这个拷贝过程,应该是发生在调用者线程中的。
当信号槽使用非阻塞式队列链接时,可能:在子线程第二次发送信号时,第一次的槽函数正在执行过程中。
而前后两次调用槽函数时,使用的是同一个形式参数的内存。
实际现象就是这样的,跨线程的信号槽队列链接,按值传递参数,依然会发生线程冲突问题。
也就是说,信号槽链接方式,仅仅是决定了槽函数的执行线程,但不保证线程安全。
方案1:
使用blockconnect
方案2:
按指针传递,并且加锁----
因为指针再信号槽的传递过程中没有锁不到的缝隙。
而按值传递,始终的存在一个锁不到的时间缝隙—
实际的信号槽中 带const&
但是在链接时,不带const& 不会报错 且会链接成功 难不成这会影响到传参形式
最终的测试结果时,无论如何,使用队列链接时,始终存在冲突—
只有使用队列链接时,才会显示正常—
此处也有肯时s_pThis获取或者hash遍历导致的