Nano Hash - криптовалюты, майнинг, программирование

Qt: QTimer создает нежелательный цикл

Я читаю и рисую данные из последовательного порта, используя Qt, я пытаюсь создать тайм-аут с классом QTimer, который отправляет функцию lettura(), она работает один раз, и после создания цикла внутри этого есть какой-то способ выбраться из этой петли? Я новичок и не знаю, как использовать thread и 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, this, 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
 
    }

  • Я не уверен, что вы подразумеваете под петлей в этом случае. Попробуйте создать минимальный воспроизводимый пример. Если вопрос касается вашего кода QTimer, то сделайте пример, который просто использует QTimer без всего остального, не относящегося к делу. 04.09.2020

Ответы:


1

Первая проблема:

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();

У вас уже есть таймер? Если вы сделаете это вместо таймера3

Есть и другие проблемы с запуском таймера при вызове ReadyRead из последовательного порта, поскольку он срабатывает каждый раз, когда байт готов, а вызов timer->start() каждый раз сбрасывает таймер. Но это попутный вопрос.

06.09.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..