找回密码
 立即注册
收起左侧

信号与槽连接的第五个参数和多线程的问题

1
回复
269
查看
[复制链接]

尚未签到

来源: 2021-8-31 22:28:22 显示全部楼层 |阅读模式
2Qter豆
信号与槽connect第五个参数代表槽函数在哪个线程中执行 :
1)自动连接(AutoConnection),默认的连接方式,如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接;如果发送者与接受者处在不同线程,等同于队列连接。
2)直接连接(DirectConnection),当信号发射时,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行,即槽函数和信号发送者在同一线程
3)队列连接(QueuedConnection),当控制权回到接受者所在线程的事件循环时,槽函数被调用。槽函数在接受者所在线程执行,即槽函数与信号接受者在同一线程


目前见到的资料都是这么写的,有些疑问?
问题1:假设两个信号A、B及触发的槽函数SlotA、SlotB均在主线程中,SlotA在执行的过程中,B信号发出了,我理解此时应该是把SlotA执行完,再去执行SlotB,但是默认不写连接方式应该是直接连接(DirectConnection),应该是B信号发出,立即执行SlotB,此时有些凌乱了。


问题2:两个线程间的信号与槽默认采用队列连接(QueuedConnection),很多资料上写如果强制采用直接连接(DirectConnection),容易出现程序崩溃问题,个人感觉也没什么问题啊,什么场景下容易出现程序崩溃呢。


望高手帮忙解解惑,不胜感激!





回复

使用道具 举报

累计签到:729 天
连续签到:1 天
5 天前 显示全部楼层
本帖最后由 Since 于 2021-9-13 11:40 编辑

1、A、B 信号在一个线程,如果 A 没有执行完,B 是不会触发的,可以试着把 A 做成死循环看看.
2、不同线程如果直连,槽函数的栈是不一样的有些变量就容易找不到,另外就是有些一些变量,类似 QTcpSocket、QProcess 无法跨线程,如果直连,也会出错.

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册