QT/C++ 多线程时,工作界面的样式频繁改变导致程序奔溃的问题

本文探讨了QT/C++中因工作线程频繁更新UI而导致程序崩溃的问题,并提供了解决方案,即通过加入非阻塞性延时来避免UI刷新频率过高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QT/C++ 多线程时,工作界面的样式频繁改变导致程序奔溃的问题

一、错误现象与原因

最近在学习QT,遇到了一点问题,是关于工作线程与UI线程的,其主要问题为:我的工作线程是一个死循环,当我点击按钮进入工作线程,我的工作线程用emit发送一个信号,通知UI界面发生改变但是我遇到了如下异常。
工作界面图
这里是程序报错时候
出现这个错误的主要原因是我们的界面变换太频繁,当我们给信号发射函数加上一个延时时,便不再报错。


二、解决办法

加入一个延时函数即可
关于延时函数的加入有两种方法
1.
这是一个阻塞的方法,不推荐使用

QThread::sleep(1);//延时一秒,程序会卡在这里

2.延时函数,非阻塞方法可用

#include <QTime>//这是头文件

QTime delayTime = QTime::currentTime().addMSecs(1000);	//在当前时间上增加3S
		              while (QTime::currentTime() < delayTime);`

总结

为什么会出现这样的原因我也不知道,我排查了好久也找不到为什么,也许可能只是UI界面变换太快,导致了错误吧!以后如果弄懂了为什么我再来把为什么出错给补上。

源码

new2.cpp文件

#include "new2.h"
#include "test_4.h"
#include <QTime>
new2::new2() {

}
void new2::run() {
	while (true) {
		QTime delayTime = QTime::currentTime().addMSecs(1000);	//在当前时间上增加3S
		while (QTime::currentTime() < delayTime);
		//QThread::sleep(1);
		updatePktCount();
	}
}

new2,h文件

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_test_4.h"
#include "new2.h"
class test_4 : public QMainWindow
{
    Q_OBJECT

public:
    test_4(QWidget *parent = Q_NULLPTR);
	
	new2 *Now_Temp=NULL;

private slots:
	void function(bool checked);
	void updateCapCalculate();

private:
    Ui::test_4Class ui;
};

工作界面test4.cpp文件

#include "test_4.h"
#include "qdebug.h"
#include "new2.h"
#include "qmutex.h"

QMutex qmutex;
test_4::test_4(QWidget *parent)
    : QMainWindow(parent)
{
	
	
    ui.setupUi(this);
	connect(
		ui.pushButton,
		SIGNAL(clicked(bool)),
		this,
		SLOT(function(bool))
		);
}

void test_4::function(bool checked) {
	Now_Temp = new new2();
	bool ret2 = connect(Now_Temp, SIGNAL(updatePktCount()), this, SLOT(updateCapCalculate()), Qt::DirectConnection);
	Now_Temp->start();
}

void test_4::updateCapCalculate()
{
	qmutex.lock();
	static int i = 0;


	ui.lineEdit->setText(QString::number(i++));
	qDebug() << i << endl;
	qmutex.unlock();
}

https://blog.csdn.net/xiezhongyuan07/article/details/81169583

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值