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