关于QT槽函数无法响应信号的问题

问题

       QT中使用信号槽是最常用的,什么情况下槽函数会不响应信号呢?笔者就遇到一种情况,分享给大家。我的一个类SignalDAQ中有4个信号,另一个类EEGAPIStreamManager中对应有4个public槽函数,如下图所示,

       并且,在SignalDAQ的构造函数中已经明确指定了信号槽连接,如下所示,

       当在SignalDAQ中发生sig_StartDAQ的时候,EEGAPIStreamManager中的on_initAPIStream槽函数正常响应,然后继续运行。但是在运行过程中,无论怎么发送其他3个信号,EEGAPIStreamManager中对应的3个槽函数始终无动于衷。不理解,刚开始以为是信号连接的问题,难道需要指定信号连接的方式,比如Qt::QueuedConnection、Qt::DirectConnection等,但实际上即便不显示指定,QT也会自动判断发送者和接收者的各自线程,然后使用对应的连接方式进行连接,比如发送者和接收者都属于同一线程,那么QT程序就直接调用,即Qt::DirectConnection;如果是不同线程,那么槽函数就运行接收者所在线程中。

       既然,不是信号槽连接方式的问题,问题点在哪呢?经过查找和调试,终于明白了:因为在程序中,on_initAPIStream槽函数是最先运行的,在这个函数中会调用on_GetEEGData(),而在on_GetEEGData()里存在着一个while循环??!!!!这就是问题的关键,while循环的执行阻塞了线程中的信号槽事件队列,导致后续的槽函数无法响应。

解决办法

       方法很简单,只需要在on_GetEEGData()中添加一句代码即可,如下,

QCoreApplication::processEvents();

这样,就能在执行while循环期间,让其他事件得以响应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值