Qt:QTimer创建一个不需要的循环

问题描述

我正在使用Qt从串行端口读取和绘制数据,我正在尝试使用QTimer类创建超时,该类发送函数“ lettura()”,它可以工作一次并在内部创建循环后那,有某种方法可以摆脱那个循环?我是一个初学者,现在我不怎么使用线程和qtimer。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QSerialPort>
#include<QtDebug>
#include<QTimer>
#include <thread>
#include<QSharedPointer>
#include"qcustomplot.h"
QSerialPort *serial;
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),ui(new Ui::MainWindow)
{
    //Timer start
      timer.start();
    //Set up form
      ui->setupUi(this);
    //Set up poerta seriale
      serial= new QSerialPort(this);
      serial->setPortName("COM3");
      serial->setBaudRate(QSerialPort::Baud115200);
      serial->setDataBits(QSerialPort::Data8);
      serial->setParity(QSerialPort::NoParity);
      serial->setStopBits(QSerialPort::OneStop);
      serial->setFlowControl(QSerialPort::NoFlowControl);
      serial->open(QIODevice::ReadOnly);
    //Set up grafici
    //Set up del grafico dell'umidità
      ui->plotH->addGraph();
      ui->plotH->graph(0)->setScatterStyle((QCPScatterStyle::ssCircle));
      ui->plotH->graph(0)->setLineStyle(QCPGraph::lsLine);
      ui->plotH->xAxis->setRange(0,8);
      ui->plotH->yAxis->setRange(0,100);
      ui->plotH->xAxis->setLabel("t[h]");
      ui->plotH->yAxis->setLabel("H[RH%]");
   //Set up del grafico della temperatura
      ui->plotT->addGraph();
      ui->plotT->graph(0)->setScatterStyle((QCPScatterStyle::ssCircle));
      ui->plotT->graph(0)->setLineStyle(QCPGraph::lsLine);
      ui->plotT->xAxis->setRange(0,8);
      ui->plotT->yAxis->setRange(-20,50);
      ui->plotT->xAxis->setLabel("t[h]");
      ui->plotT->yAxis->setLabel("T[°C]");
   //Connessione con la funzione principale

   connect(serial,&QSerialPort::readyRead,this,&MainWindow::Reader);


}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::Reader()
{

    QTimer *timer3 = new QTimer(this);
     connect(timer3,&QTimer::timeout,QOverload<>::of(&MainWindow::lettura));
     timer3->start(10000);

}



void MainWindow::PLOTTER_H()
{
    ui->plotH->graph(0)->setData(vec_t,vec_H);
    ui->plotH->replot();
    ui->plotH->update();
}

void MainWindow::PLOTTER_T()
{
    ui->plotT->graph(0)->setData(vec_t,vec_T);
    ui->plotT->replot();
    ui->plotT->update();
}

void MainWindow::addPoints(double HUM,double TEMP,double t)
{
    vec_t.append(t);
    vec_H.append(HUM);
    vec_T.append(TEMP);
}



void MainWindow::Clear()
{
vec_t.clear();
vec_T.clear();
vec_H.clear();
}

void MainWindow::on_Clear_clicked()
{
Clear();
PLOTTER_H();
PLOTTER_T();
}

void MainWindow::lettura()
{

    //Letura dei dati
    serial->waitForReadyRead();
    m_readData=serial->QSerialPort::readAll();
    //Sgrossatura dei dati
       inter=QString(m_readData);
      QStringList firstlist2= inter.split("$");
      m_readData2=firstlist2.takeFirst();
      inter2=QString(m_readData2);
      QStringList firstlist3= inter2.split(" ");
      m_readData3=firstlist3.takeFirst();
      H=m_readData3.toDouble();
      QStringList firstlist4=inter2.split(" ");
      m_readData4=firstlist4.takeLast();
      T=m_readData4.toDouble();
      //Ottenere dal timer la variabile tempo
         milli=timer.elapsed();
        double sec=milli/1000;
        min=sec/60;
        double ore=min/60;

        //Creazione dei punti
          addPoints(H,T,min);
          //Aggiunta dei punti ai grafici
            PLOTTER_H();
            PLOTTER_T();
       
            //Programma in stand-by per 5 minuti
          //Sleep(10000);
             // QThread::sleep(10);           //300
 
    }

解决方法

第一个问题是:

void MainWindow::Reader()
{
    QTimer *timer3 = new QTimer(this); <--- The timer is created here
    connect(timer3,&QTimer::timeout,this,QOverload<>::of(&MainWindow::lettura));
    timer3->start(10000);
} <-- and destroyed here.

您需要在构造函数中将timer3指针创建为成员变量,然后在构造函数中建立连接,并在构造函数中将其设置为singleshot(如果您将以这种方式使用)。然后只需调用timer3-> start(10000)

另一个问题是什么

timer.start();

您已经有计时器了吗?如果您这样做,而不是使用timer3,

从串行端口通过ReadyRead调用启动计时器还有其他问题,因为它将在每次字节准备就绪时触发,并且timer-> start()调用将每次重置计时器。但这是一个线程问题。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...