如何解决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()调用将每次重置计时器。但这是一个线程问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。