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

qt中的信号和槽会打断正在执行的函数吗

18
回复
41408
查看
[复制链接]
累计签到:615 天
连续签到:1 天
来源: 2015-8-28 18:47:56 显示全部楼层 |阅读模式
5Qter豆
我知道中断是这样的,会打断正在执行的函数,,,但是我弄不太明白QT的信号和槽的执行机理,
比如:有A()函数,slotB()是槽函数, 信号click()和B()相连

单线程,,现在正在执行A()函数,还没执行完,click()信号来到了,B()会马上去执行吗?还是说等待A()执行完了再去执行!
还有如果说A本身也是个和另一个信号相连的槽函数,,click()来到了,B()会到什么时候去执行?

求大神们指教,,(我去百度了下,,说是讲"信号和槽的机理",,实际上还是讲信号槽怎用)  还有没有讲这方面知识的连接,发一个呗,小弟先谢过了

最佳答案

查看完整内容

忘了,我很久之前在某国外网站看的
回复

使用道具 举报

尚未签到

2015-8-28 18:47:57 显示全部楼层
qq1043068972 发表于 2015-8-30 08:42
哥,哪里能查到这方面的资料?

忘了,我很久之前在某国外网站看的
回复

使用道具 举报

尚未签到

2015-8-28 21:18:55 显示全部楼层
我记得应该是这样工作的:
单线程:emit 后,信号会进入一个队列里面,等当前代码段执行完后,才看队列里面还有没有信号;
多线程:同样emit后,当前进程和单线程一样,别的线程会去查看这个队列看看有没有给自己的信号;

点评

"等当前代码段执行完后"这句话的的"当前代码"只的是这一行代码,还是这个函数执行完了?  详情 回复 发表于 2015-8-28 23:01
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-28 23:01:02 显示全部楼层
Joey_Chan 发表于 2015-8-28 21:18
我记得应该是这样工作的:
单线程:emit 后,信号会进入一个队列里面,等当前代码段执行完后,才看队列里面 ...

"等当前代码段执行完后"这句话的的"当前代码"只的是这一行代码,还是这个函数执行完了?
回复

使用道具 举报

尚未签到

2015-8-29 23:53:20 显示全部楼层
qq1043068972 发表于 2015-8-28 23:01
"等当前代码段执行完后"这句话的的"当前代码"只的是这一行代码,还是这个函数执行完了? ...

函数

点评

Qt::AutoConnection 0(Default) If the receiver lives in the thread that emits the signal, Qt:irectConnection is used. Otherwise, Qt:ueuedConnection is used. The connection type is determined when t  详情 回复 发表于 2015-8-31 09:47
哥,哪里能查到这方面的资料?  详情 回复 发表于 2015-8-30 08:42
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-30 08:42:42 显示全部楼层
Joey_Chan 发表于 2015-8-29 23:53
函数

哥,哪里能查到这方面的资料?
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2015-8-31 09:16:19 显示全部楼层
Qt::ConnectionType
里面分好多种情况
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-31 09:47:39 显示全部楼层
Joey_Chan 发表于 2015-8-29 23:53
函数

Qt::AutoConnection        0(Default) If the receiver lives in the thread that emits the signal, Qt:irectConnection is used. Otherwise, Qt:ueuedConnection is used. The connection type is determined when the signal is emitted.
Qt:irectConnection          1The slot is invoked immediately when the signal is emitted. The slot is executed in the signalling thread.
Qt:ueuedConnection    2The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.

哥,这个QT的文档,,看第二条说的(DirectConnection),意思就是说,,如果这个信号和槽在同一个线程里,那么一有信号就去执行该槽了,是吧?那不跟中断一样了?

点评

对头,紫薯紫薯紫薯紫薯紫薯紫薯  详情 回复 发表于 2015-8-31 09:52
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2015-8-31 09:52:39 显示全部楼层
qq1043068972 发表于 2015-8-31 09:47
Qt::AutoConnection        0(Default) If the receiver lives in the thread that emits the signal, Qt:irec ...

对头,紫薯紫薯紫薯紫薯紫薯紫薯

点评

但是我测试了下,,Qt:irectConnection 确实是 立马就执行槽函数了,但是执行完槽函数,,它又会返回到原函数,,把未执行完的继续执行下去,,,,跟中断还不完全一样!(貌似中断我们手动把那个"断点压栈",最后中断函数执行完  详情 回复 发表于 2015-8-31 11:26
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-31 11:26:05 显示全部楼层
KaoN 发表于 2015-8-31 09:52
对头,紫薯紫薯紫薯紫薯紫薯紫薯

但是我测试了下,,Qt:irectConnection 确实是 立马就执行槽函数了,但是执行完槽函数,,它又会返回到原函数,,把未执行完的继续执行下去,,,,跟中断还不完全一样!(貌似中断我们手动把那个"断点压栈",最后中断函数执行完毕后再出栈!)

点评

我不了解你说的中断欸。。。你意思是,中断应该不继续执行信号后面的语句么?  详情 回复 发表于 2015-8-31 12:17
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2015-8-31 12:17:30 显示全部楼层
qq1043068972 发表于 2015-8-31 11:26
但是我测试了下,,Qt:irectConnection 确实是 立马就执行槽函数了,但是执行完槽函数,,它又会返回到原函 ...

我不了解你说的中断欸。。。你意思是,中断应该不继续执行信号后面的语句么?

点评

如果是,,Qt: DirectConnection 这种连接方式,,应该会造成这种bug吧: 信号sigA()(PS:slotA是个很长的函数)和slotA()关联了,当信号sigA()发射了,slotA()去执行了,然后,,当slotA()执行到一半,sigA()又发射了,然后 又出  详情 回复 发表于 2015-8-31 18:37
恩,写汇编的时候,就是这样,都要先保存以前的地址,,然后执行完了,在返回到原来的程序地址,,如果不这么做,,程序就跑飞了,,,估计QT应该是把这一步在底层给实现好了!  详情 回复 发表于 2015-8-31 18:32
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-31 18:32:21 显示全部楼层
KaoN 发表于 2015-8-31 12:17
我不了解你说的中断欸。。。你意思是,中断应该不继续执行信号后面的语句么? ...

恩,写汇编的时候,就是这样,都要先保存以前的地址,,然后执行完了,在返回到原来的程序地址,,如果不这么做,,程序就跑飞了,,,估计QT应该是把这一步在底层给实现好了!
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-31 18:37:06 显示全部楼层
KaoN 发表于 2015-8-31 12:17
我不了解你说的中断欸。。。你意思是,中断应该不继续执行信号后面的语句么? ...

如果是,,Qt:  DirectConnection 这种连接方式,,应该会造成这种bug吧: 信号sigA()(PS:slotA是个很长的函数)和slotA()关联了,当信号sigA()发射了,slotA()去执行了,然后,,当slotA()执行到一半,sigA()又发射了,然后 又出立即执行slotA() 这样不就打破了函数执行的完整性,,很容易造成数据异常吧!?

点评

在slotA中发射sigA? 如果是direct,那就死循环了  详情 回复 发表于 2015-9-1 09:28
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2015-9-1 09:28:10 显示全部楼层
qq1043068972 发表于 2015-8-31 18:37
如果是,,Qt:  DirectConnection 这种连接方式,,应该会造成这种bug吧: 信号sigA()(PS:slotA是个很长的函数 ...

在slotA中发射sigA?
如果是direct,那就死循环了

点评

恩,,就算不是在slotA 中发射,,sigA信号发射的频率过快的话,slotA 还没执行完,,信号又来到了,,又进入槽函数了,这样的话也是死循环了  详情 回复 发表于 2015-9-1 09:36
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-9-1 09:36:51 显示全部楼层
KaoN 发表于 2015-9-1 09:28
在slotA中发射sigA?
如果是direct,那就死循环了

恩,,就算不是在slotA 中发射,,sigA信号发射的频率过快的话,slotA 还没执行完,,信号又来到了,,又进入槽函数了,这样的话也是死循环了

点评

direct的话,只有等当前slot执行完,才会继续往下执行,所以,如果siga,只要不再slota里,应该就没事  详情 回复 发表于 2015-9-1 09:52
回复

使用道具 举报

累计签到:6 天
连续签到:1 天
2015-9-1 09:52:35 显示全部楼层
qq1043068972 发表于 2015-9-1 09:36
恩,,就算不是在slotA 中发射,,sigA信号发射的频率过快的话,slotA 还没执行完,,信号又来到了,,又进入槽函 ...

direct的话,只有等当前slot执行完,才会继续往下执行,所以,如果siga,只要不再slota里,应该就没事
回复

使用道具 举报

累计签到:14 天
连续签到:1 天
2016-1-5 11:51:05 显示全部楼层
不会中断的,是一个队列,等该函数执行完才能执行这个槽函数

点评

这个跟信号和槽的关联的方式有关系  详情 回复 发表于 2016-1-5 15:26
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2016-1-5 15:26:04 显示全部楼层
daysMark 发表于 2016-1-5 11:51
不会中断的,是一个队列,等该函数执行完才能执行这个槽函数

这个跟信号和槽的关联的方式有关系
回复

使用道具 举报

尚未签到

2021-7-15 10:33:09 显示全部楼层
qq1043068972 发表于 2015-8-31 11:26
但是我测试了下,,Qt:irectConnection 确实是 立马就执行槽函数了,但是执行完槽函数,,它又会返回到原函 ...

感觉你和我理解的中断不一样啊,中断不就是中断触发马上跳到中断函数,执行完后继续回到原函数从中断位置继续往下执行吗
回复

使用道具 举报

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

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了