Считывание данных с сервера и визуализация на Qt

ПО обеспечивает визуализацию точек на координатной плоскости. Каждая точка характеризуется идентификатором (ID). Информация о точках передается ТСР-сервером папка accel: https://drive.google.com/drive/folders/1Hf3NgNfmnn1sVswDRjVUW4E3Vg5iogSt?usp=sharing . Также в этой ссылке все исходники моей программы.

Обозначу две проблемы с которыми я столкнулся. Первая проблема заключается в том, что появляется точка с ID=-500 при первичном запуске сервера, хотя на самом сервере ее пока нет, как я понял мне нужно организовать поиск конца пакета, но пока не представляю как.

Точка с ID=-500, которой не должно быть

Вторая проблема- это некорректное отображение скорости. Для расчета скорости нужно считать время между вызовами readAll и делить на него объем принятых данных - так мне подсказали, но реализовать это я пока не додумался.

Код программы:

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QTime>
#include <QTimer>
#include <QElapsedTimer>
#include <QString>
#include <QByteArray>
#include <QPixmap>
#include <QPainter>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    timer->setInterval(100);
    connect(timer, SIGNAL(timeout()), this, SLOT(updateTime()));
}

MainWindow::~MainWindow()
{
    delete ui;

    delete timer;
    delete socket;
}

void MainWindow::on_pushButton_clicked()
{
    QString address = ui->lineEdit->text();
    int port = ui->spinBox->value();
    qDebug() << address << " " << port;

    socket = new QTcpSocket(this);
    socket->connectToHost(address, port);
    if (socket->waitForConnected(5000))
    {
        ui->label_13->setText("Connected!");
        timer->start(100);
    }
}

void MainWindow::updateTime()
{
    QPixmap pix(101,101);
    QPainter paint(&pix);
    paint.fillRect(0,0,101,101, Qt::white);

    QTime t;
    t.start();

    socket->waitForReadyRead(5000);
    QByteArray answer = socket->readAll();

    int timeelapsed = t.elapsed();
    double finish = timeelapsed*0.1;
    if (finish!=0)
    {
        double speed = answer.size()/finish;
        ui->label_12->setText(QString::number(speed));
    }

    int* i = (int*)answer.data();

    ui->label_5->setText(QString::number(i[0]));
    ui->label_7->setText(QString::number(i[1]));
    ui->label_9->setText(QString::number(i[2]));
    ui->label_16->setText(QString::number(i[3]));
    ui->label_14->setText(QString::number(i[4]));
    ui->label_15->setText(QString::number(i[5]));


    paint.fillRect(i[1] + 50, -i[2] + 50, 3, 3 , Qt::red);

    paint.fillRect(i[4] + 50, -i[5] + 50, 3, 3, Qt::black);
    ui->label_3->setPixmap(pix);
}


void MainWindow::on_pushButton_2_clicked()
{
//    ui->label_5->clear();
//    ui->label_7->clear();


    socket->close();
    delete socket;

    ui->label_13->setText("Disconnected!");

//    QApplication::quit();
}

Ответы (1 шт):

Автор решения: Azich

Все оказалось просто надо было исключить этот пакет с ID = -500

→ Ссылка