qq1043068972 发表于 2015-8-28 18:47:56

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

我知道中断是这样的,会打断正在执行的函数,,,但是我弄不太明白QT的信号和槽的执行机理,
比如:有A()函数,slotB()是槽函数, 信号click()和B()相连

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

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

Joey_Chan 发表于 2015-8-28 18:47:57

qq1043068972 发表于 2015-8-30 08:42 static/image/common/back.gif
哥,哪里能查到这方面的资料?

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

Joey_Chan 发表于 2015-8-28 21:18:55

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

qq1043068972 发表于 2015-8-28 23:01:02

Joey_Chan 发表于 2015-8-28 21:18 static/image/common/back.gif
我记得应该是这样工作的:
单线程:emit 后,信号会进入一个队列里面,等当前代码段执行完后,才看队列里面 ...

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

Joey_Chan 发表于 2015-8-29 23:53:20

qq1043068972 发表于 2015-8-28 23:01 static/image/common/back.gif
"等当前代码段执行完后"这句话的的"当前代码"只的是这一行代码,还是这个函数执行完了? ...

函数

qq1043068972 发表于 2015-8-30 08:42:42

Joey_Chan 发表于 2015-8-29 23:53 static/image/common/back.gif
函数

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

KaoN 发表于 2015-8-31 09:16:19

Qt::ConnectionType
里面分好多种情况

qq1043068972 发表于 2015-8-31 09:47:39

Joey_Chan 发表于 2015-8-29 23:53 static/image/common/back.gif
函数

Qt::AutoConnection        0(Default) If the receiver lives in the thread that emits the signal, Qt::DirectConnection is used. Otherwise, Qt::QueuedConnection is used. The connection type is determined when the signal is emitted.
Qt::DirectConnection          1The slot is invoked immediately when the signal is emitted. The slot is executed in the signalling thread.
Qt::QueuedConnection    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),意思就是说,,如果这个信号和槽在同一个线程里,那么一有信号就去执行该槽了,是吧?那不跟中断一样了?

KaoN 发表于 2015-8-31 09:52:39

qq1043068972 发表于 2015-8-31 09:47 static/image/common/back.gif
Qt::AutoConnection        0(Default) If the receiver lives in the thread that emits the signal, Qt:irec ...

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

qq1043068972 发表于 2015-8-31 11:26:05

KaoN 发表于 2015-8-31 09:52 static/image/common/back.gif
对头,紫薯紫薯紫薯紫薯紫薯紫薯

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

KaoN 发表于 2015-8-31 12:17:30

qq1043068972 发表于 2015-8-31 11:26 static/image/common/back.gif
但是我测试了下,,Qt:irectConnection 确实是 立马就执行槽函数了,但是执行完槽函数,,它又会返回到原函 ...

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

qq1043068972 发表于 2015-8-31 18:32:21

KaoN 发表于 2015-8-31 12:17 static/image/common/back.gif
我不了解你说的中断欸。。。你意思是,中断应该不继续执行信号后面的语句么? ...

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

qq1043068972 发表于 2015-8-31 18:37:06

KaoN 发表于 2015-8-31 12:17 static/image/common/back.gif
我不了解你说的中断欸。。。你意思是,中断应该不继续执行信号后面的语句么? ...

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

KaoN 发表于 2015-9-1 09:28:10

qq1043068972 发表于 2015-8-31 18:37 static/image/common/back.gif
如果是,,Qt:DirectConnection 这种连接方式,,应该会造成这种bug吧: 信号sigA()(PS:slotA是个很长的函数 ...

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

qq1043068972 发表于 2015-9-1 09:36:51

KaoN 发表于 2015-9-1 09:28 static/image/common/back.gif
在slotA中发射sigA?
如果是direct,那就死循环了

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

KaoN 发表于 2015-9-1 09:52:35

qq1043068972 发表于 2015-9-1 09:36 static/image/common/back.gif
恩,,就算不是在slotA 中发射,,sigA信号发射的频率过快的话,slotA 还没执行完,,信号又来到了,,又进入槽函 ...

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

daysMark 发表于 2016-1-5 11:51:05

不会中断的,是一个队列,等该函数执行完才能执行这个槽函数

qq1043068972 发表于 2016-1-5 15:26:04

daysMark 发表于 2016-1-5 11:51 static/image/common/back.gif
不会中断的,是一个队列,等该函数执行完才能执行这个槽函数

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

ronggggg 发表于 2021-7-15 10:33:09

qq1043068972 发表于 2015-8-31 11:26
但是我测试了下,,Qt:irectConnection 确实是 立马就执行槽函数了,但是执行完槽函数,,它又会返回到原函 ...

感觉你和我理解的中断不一样啊,中断不就是中断触发马上跳到中断函数,执行完后继续回到原函数从中断位置继续往下执行吗
页: [1]
查看完整版本: qt中的信号和槽会打断正在执行的函数吗