问题
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循环期间,让其他事件得以响应。

2786

被折叠的 条评论
为什么被折叠?



