【发布时间】:2022-06-23 20:00:58
【问题描述】:
如何检查非 GUI 类的更改,我想检查无限循环中 COM 端口的更新,但如果我这样做,我的应用程序会冻结和崩溃。
我尝试使用QThread,但没有解决问题
Main.cpp
#include "mainwindow.h"
#include "CheckPortsThread.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
checkPorts ports;
w.show();
ports.run();
return a.exec();
}
MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSerialPortInfo>
#include <QApplication>
#include <QList>
#include <QDebug>
#include <QSerialPort>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
QSerialPort *serial;
};
#endif // MAINWINDOW_H
MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#define Debug
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
serial = new QSerialPort;
QString description;
QList<QSerialPortInfo> serialPortInfos = QSerialPortInfo::availablePorts();
int portsNumber = serialPortInfos.count();
#ifdef Debug
qDebug() << "Total numbers of ports: " << portsNumber;
#endif
if (portsNumber > 0){
for (const QSerialPortInfo &serialPortInfo : qAsConst(serialPortInfos))
{
description = serialPortInfo.portName() + " [" + serialPortInfo.description() +"]" ;
#ifdef Debug
qDebug() << "Port: "<< description << endl;
#endif
}
ui->comboBox->addItem(description);
}
}
MainWindow::~MainWindow()
{
delete ui;
}
CheckPortsThread.h
#ifndef CHECKPORTSTHREAD_H
#define CHECKPORTSTHREAD_H
#endif // CHECKPORTSTHREAD_H
#include <QtCore>
class checkPorts: public QThread{
public:
checkPorts();
void run() override;
};
CheckPortsThread.cpp
#include "CheckPortsThread.h"
void checkPorts::run(){
while (true){
for (int i = 0; i < 100; i++)
qDebug() << i << endl;
}
}
checkPorts::checkPorts(){}
所以 run() 方法压垮了程序
【问题讨论】:
-
我的意思是无限循环是一个会破坏我的程序的问题,但是如何检查 com 更新?
-
我真的不确定我是否理解这个问题,但是...如果您想在特定串行端口上通知任何更改等,然后创建一个
QSerialPort实例并连接到一个或多个它的signals。 -
我想查看天气是否添加了新端口
-
也许添加一个计时器并定期检查?就像 run() 函数一样,没有在计时器上执行 while 循环
标签: c++ qt5 qt-creator