【问题标题】:How to track not GUI events in QT creator?如何在 QT 创建者中跟踪非 GUI 事件?
【发布时间】: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


【解决方案1】:

您正在调用 QThread 派生类的 ::run 方法,因此实际上没有启动任何线程,run 方法只是从主线程中调用。

改为在线程调用checkPorts.start() 中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    相关资源
    最近更新 更多