学习Qt的信号与槽章节时, 对于在connect的第五个参数没有过多的关注,在学到多线程编程章节时,才知道connect的第五个参数非常的重用, 而且在面试的也问到了。现总结如下(也欢迎其他大牛指正):
qt 帮助文档:
1. Qt::AutoConnection:自动(默认)。信号发射对象如果和槽的执行对象在同一个线程,将是直连方式,否则就是队列方式。
2. Qt::DirectConnection:直连。信号一旦发射,槽立即执行,并且槽是在信号发射的线程中执行的。(同一线程是同步执行)
3. Qt::QueuedConnection:队列。信号发射后当事件循环返回到接收线程时槽函数就执行了,也就是说这种连接方式不是立即触发槽函数的,而是要排队等的,并且是在槽函数的线程中执行。(不同线程是异步执行)
4. Qt::BlockingQueuedConnection:阻塞队列。在槽函数返回之前槽函数所在的线程都是阻塞的。
5. Qt::UniqueConnection:唯一。和直连相同,但是只能一对一连接。
实际开发中,用得最多的是直接连接与队列连接。 我总结一下:
(1) connect的第五个参数的默认连接是 Qt::AutoConnection:自动(默认), 当信号发送者与信号接收者在同一线程,默认的链接方式将变成直接连接Qt::DirectConnection,否则默认的链接方式将变成队列连接Qt::QueuedConnection
(2) 直接连接方式: 槽函数所在线程与信号发送者对象在同一线程
队列连接方式: 槽函数所在线程与信号接收者对象在同一线程
qt 帮助文档:
1. Qt::AutoConnection:自动(默认)。信号发射对象如果和槽的执行对象在同一个线程,将是直连方式,否则就是队列方式。
2. Qt::DirectConnection:直连。信号一旦发射,槽立即执行,并且槽是在信号发射的线程中执行的。(同一线程是同步执行)
3. Qt::QueuedConnection:队列。信号发射后当事件循环返回到接收线程时槽函数就执行了,也就是说这种连接方式不是立即触发槽函数的,而是要排队等的,并且是在槽函数的线程中执行。(不同线程是异步执行)
4. Qt::BlockingQueuedConnection:阻塞队列。在槽函数返回之前槽函数所在的线程都是阻塞的。
5. Qt::UniqueConnection:唯一。和直连相同,但是只能一对一连接。
实际开发中,用得最多的是直接连接与队列连接。 我总结一下:
(1) connect的第五个参数的默认连接是 Qt::AutoConnection:自动(默认), 当信号发送者与信号接收者在同一线程,默认的链接方式将变成直接连接Qt::DirectConnection,否则默认的链接方式将变成队列连接Qt::QueuedConnection
(2) 直接连接方式: 槽函数所在线程与信号发送者对象在同一线程
队列连接方式: 槽函数所在线程与信号接收者对象在同一线程