qt开启线程界面假死问题解决

一、前言

在 使用qt高速读取传感器数据时,如果想要将数据实时刷新在界面,就需要开启一个线程单独去跑读取数据函数,并反馈给主程序,否则在主程序中读取和刷新界面会很卡很卡,但是在开启多线程,无外接鼠标键盘的linux环境下,发现一个问题,就是每个一段时间界面就假死,程序实际还在运行,指示界面卡住了,打印信息都正常,后来发现连接鼠标的话一动鼠标界面就恢复正常,但是也不会一直接着鼠标,卡死了就会认为真的死了,折腾了2天,累的我手指头只疼,终于解决这个问题了,发现问题的原因所在,这里发一个帖子记录一下,也希望能帮助到遇到此问题的朋友。

二、环境

宿主机:window10,Ubuntu16.04

目标及:a40i,linux3.10

三、正文

发生问题的原因是因为我在开启线程后,将读取数据程序放在run函数中一直跑,然后通过绑定槽函数的方式,将读取的数据传递给主程序,然后在主程序中刷新控件到界面显示,问题就是出现在这里,我直接在接收数据的槽函数中加入了控件刷新程序,就导致不定间隔时间,就将界面卡死,怀疑是有时刷新界面太快,倒是界面缓存溢出,系统无法做出及时响应,故进入一种故障模式,界面假死,但底层程序不受影响,仍然正常打印信息。

解决办法:将主程序中的接收线程槽函数中的刷新控件函数移出,放入到一个单独开启的定时器中,这个具体还得根据实际情况,有的人可能将控件刷新就放在槽函数中没有问题,可能是我这个硬件的问题,也算是暂时找到一种解决问题的办法,否者只能忍耐这主线程卡的状态去用了。

四、结语

手指头疼

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Qt Creator 多线程读取文件到程序显示 利用QT Creator多任务读取一个文档到程序里 为了防止直接读取文件里的内容太大而发生卡顿,于是多线程读取将更高效的解决这个问题。 效果图如下: 其中pro文件无需改动,默认就好,头文件h里面的内容为 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MyObj; class MyObj : public QObject { Q_OBJECT public: MyObj(); //新的线程 signals: void toLine(QString line); private slots: void doWork(); }; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void appendText(QString); //定义一个槽 private: Ui::MainWindow *ui; QThread *t; MyObj *obj; }; #endif // MAINWINDOW_H 而MAIN主文件的内容为了防止中文乱码做了如下修改: #include "mainwindow.h" #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); //设置中文字体 防止乱码 a.setFont(QFont("Microsoft Yahei", 9)); //设置中文编码 #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) #if _MSC_VER QTextCodec *codec = QTextCodec::codecForName("GBK"); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); #endif QTextCodec::setCodecForLocale(codec); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec); #else QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(codec); #endif MainWindow w; w.show(); return a.exec(); } 接下来重点来了,源文件CPP里为 #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); t = new QThread(); //QThread obj = new MyObj(); obj->moveToThread(t); qDebug()<<"main thread:"<<QThread::currentThread(); connect(t,SIGNAL(started()), obj, SLOT(doWork())); connect(obj,SIGNAL
Qt中,可以通过QThread类来创建线程,通过QSerialPort类来实现串口通信。下面是一个示例代码,演示了如何开启线程接收串口数据,并通过主线程界面实时显示。 ```cpp #include <QApplication> #include <QSerialPort> #include <QThread> #include <QTextEdit> #include <QObject> // 自定义线程类,用于接收串口数据 class SerialThread : public QThread { Q_OBJECT public: explicit SerialThread(QObject *parent = nullptr) : QThread(parent) {} protected: void run() override { QSerialPort serial; serial.setPortName("COM1"); // 设置串口号,根据实际情况修改 serial.setBaudRate(QSerialPort::Baud115200); // 设置波特率,根据实际情况修改 if (!serial.open(QIODevice::ReadOnly)) { emit error(serial.errorString()); return; } while (!isInterruptionRequested()) { if (serial.waitForReadyRead(100)) { QByteArray data = serial.readAll(); emit newData(data); } } serial.close(); } signals: void error(const QString &errorMsg); void newData(const QByteArray &data); }; // 主窗口类 class MainWindow : public QTextEdit { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr) : QTextEdit(parent) {} public slots: void handleError(const QString &errorMsg) { append("错误:" + errorMsg); } void handleNewData(const QByteArray &data) { append("接收数据:" + QString(data)); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow mainWindow; mainWindow.resize(400, 300); mainWindow.show(); SerialThread serialThread; QObject::connect(&serialThread, &SerialThread::error, &mainWindow, &MainWindow::handleError); QObject::connect(&serialThread, &SerialThread::newData, &mainWindow, &MainWindow::handleNewData); serialThread.start(); return app.exec(); } #include "main.moc" ``` 以上代码实现了一个简单的Qt应用程序,在主线程显示的文本框中实时输出从串口接收到的数据。你需要根据实际情况修改串口号和波特率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桶矿泉水

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值