Qt信号与槽会被阻塞的问题

news/2025/2/20 22:58:17/

最新在开发的时候发现这么一个情况
把自定义信号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就可以被打印出来。


http://www.ppmy.cn/news/836332.html

相关文章

QT中信号和槽详解

一、QT中信号和槽的机制 1、贴图来理解信号和槽的关系 2、解释 &#xff08;1&#xff09;信号和槽是用于QT对象之间的通信&#xff0c;信号可以有某种动作触发&#xff0c;也可以直接由代码触发。 &#xff08;2&#xff09;槽也叫操函数&#xff0c;当完成了信号和槽的连接…

解决QSql 执行exec函数卡住问题

一、问题 软件与数据库通讯过程遇到断网时,QSqlQuery query执行exec(sql)时堵塞,必须等到系统设定的断网检测超时时间后,才会返回,此时执行exec的为UI线程,那么容易出现界面长时间卡顿问题;将数据库的部分操作,或者数据库联网查询功能放入线程中执行,避免问题1出现,此…

QT线程界面也存在卡死的问题

qt线程中的信号传递参数时要注意。 如果线程中是在循环内发送信号的话&#xff0c;我们必须要给循环加延时&#xff0c;否则界面也会卡死。 因为线程中不停的循环所以一直重复发送该信号&#xff0c;导致资源分配问题。

QT|C++QMessagebox卡死,程序无响应问题解决方法

多线程调用时在子线程里使用QMessageBox会出现此问题&#xff0c;用发送信号的方式解决这个问题。我这里只用了information类型&#xff0c;可以再加一个枚举类型参数区分提示框的类型。 // 头文件定义 // 信号 signals: void emitQMessageBox(QString _title,QString _text);…

QT 卡死解决

QT和有道词典有冲突&#xff0c;使用QT的时候不要用有道的取词和划词功能&#xff0c;不然容易卡死。

(Qt)记一次Qt安装器卡死的问题

今天想补充安装QChart&#xff0c;熟练的打开Qt安装目录下的安装器&#xff0c;发现点击安装器界面老是卡死&#xff0c;一脸懵逼&#xff0c;又把Qt卸载重装&#xff0c;一样的&#xff0c;后来百度发现是有道词典导致Qt安装器卡死&#xff0c;退出&#xff0c;就可以了。大写…

QT项目卡死在Reading Project

在打开项目时&#xff0c;或做出一些修改后重新编译会出现这些问题&#xff1b; 解决方式&#xff1a; 先强行关掉QT&#xff0c;进入项目目录下&#xff0c;删除后缀为.user和.user.xxxx的文件&#xff1b; 然后重新打开即可

修复QtCreator 卡死现象

1、关闭QtCreator 2、删除自己电脑C盘\用户xxx\AppData\Roaming\QtProject 目录 3、删除自己电脑C盘\用户xxx\.designer 目录 4、 重新打开 QtCreator &#xff0c;基本没什么问题