信号槽机制的心得

使用信号和槽机制,要注意以下问题:

1、信号和槽的机制是非常有效的,但是它不像“真正的”回调那样快。信号和槽稍微有些慢,这是因为它们所提供的灵活性。但这种损失相对来说是比较小的。但要追求高效率的话,比如在实时系统中就要尽量少用这种机制。

2、信号和槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时有可能形成死循环,所以,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样的信号。

3、如果一个信号和多个槽相关联的话,那当这个信号被发射时,与之相关联的槽的执行顺序将是髓机的,且顺序不能指定。

4、宏定义不能用在signal和slot的参数中。

5、构造函数不能用在signals和slots声明区域内。

6、函数指针不能作为信号或槽的参数。

7、信号和槽不能有缺省参数值。

8、信号和槽不能携带模板类参数。

9、嵌套的类不能位于信号和槽区域内,也不能有信号或者槽。

10、友元声明不能位于信号和槽的声明区域内。

参考:

http://blog.csdn.net/hufengvip/article/details/6580553

---------------------------------------------------------------------

通常使用的connect,实际上最后一个参数使用的是Qt::AutoConnection类型:
Qt支持6种连接方式,其中3中最主要:
Qt::DirectConnection(直连方式)
当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。(信号与槽函数关系类似于函数调用,同步执行)
Qt::QueuedConnection(排队方式)
当信号发出后,排队到信号队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,调用相应的槽函数。emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕。(此时信号被塞到信号队列里了,信号与槽函数关系类似于消息通信,异步执行)
Qt::AutoConnection(自动方式)
Qt的默认连接方式,如果信号的发出和接收这个信号的对象同属一个线程,那个工作方式与直连方式相同;否则工作方式与排队方式相同。
参见文章:http://blog.csdn.net/qq419036154/article/details/6112503
追问
如果第五个参数没加的话,默认表示的是同步还是异步呢?
回答
没加的话与直连方式相同:当信号发出后,相应的槽函数将立即被调用。emit语句后的代码将在所有槽函数执行完毕后被执行。(信号与槽函数关系类似于函数调用,同步执行)
个人觉得,在这个线程内是顺序执行、同步的,但是与其它线程之间肯定是异步的了。如果使用多线程,仍然需要手动同步。
参考:
http://zhidao.baidu.com/question/424073495.html
-------------------------------------------------------------

Qt中线程跟信号槽的关系
http://wan-2004.iteye.com/blog/1169265

原文地址:https://www.cnblogs.com/findumars/p/3993900.html