概述
最新在开发的时候发现这么一个情况
把自定义信号connect到一个槽函数,而在槽函数内部执行的时候用了一个eventloop阻塞当前代码执行,这样的结果就是在emit了自定义的信号后就被槽函数的调用阻塞住了,不会再往下执行,如下:
signals:
void signal_one();
connect(this, SIGNAL(signal_one()), this, SLOT(funcB()));
void funcA() {
emit signal_one();
std::cout << "after emit" << std::endl;
}
void funcB() {
QEventLoop loop;
loop.exec();
}
这样的结果就是那句after emit并不会被打印,所以大概可以知道Qt的信号触发的槽函数和发出信号本身是处在同一个线程当中的,无法异步执行
我用的解决办法是在类中定义一个QTimer *timer,然后connect(timer, SIGNAL(timeout()), this, SLOT(funcC()));
在funcB中就只是执行timer.start(10);
,而在funcC中去执行阻塞的操作,这样在funcA中emit信号之后,那句after emit就可以被打印出来。
最后
以上就是精明身影为你收集整理的Qt信号与槽会被阻塞的问题的全部内容,希望文章能够帮你解决Qt信号与槽会被阻塞的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复