QT Windows GUI main window freezes while running
-
I'm trying to receive dynamic data from a NRF device over BLE and plot it but the mainwindow.ui freezes in 5 seconds. Any leads will be highly appreciated.
Below is my Mainwindow.cpp source code.
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStatusBar>MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_bleInterface = new BLEInterface(this);this->sampleRate = 16000; this->init_plot(); connect(m_bleInterface, &BLEInterface::dataReceived, this, &MainWindow::dataReceived); connect(m_bleInterface, &BLEInterface::devicesNamesChanged, [this] (QStringList devices){ ui->devicesComboBox->clear(); ui->devicesComboBox->addItems(devices); }); connect(m_bleInterface, &BLEInterface::servicesChanged, [this] (QStringList services){ ui->servicesComboBox->clear(); ui->servicesComboBox->addItems(services); }); connect(m_bleInterface, &BLEInterface::statusInfoChanged, [this](QString info, bool){ this->statusBar()->showMessage(info); }); connect(m_bleInterface, &BLEInterface::dataReceived, this, &MainWindow::plotData); m_bleInterface->scanDevices();
}
MainWindow::~MainWindow()
{
delete ui;
}void MainWindow::init_plot()
{
// generate some data:
this->plotData_Y = QVector<double>(this->sampleRate); // initialize with entries 0..100double h = (this->sampleRate - 0) / static_cast<double>(this->sampleRate-1); std::vector<double> x(this->sampleRate); std::vector<double>::iterator i; double val; for (i = x.begin(), val = 0; i != x.end(); ++i, val += h) { *i = val; } this->plotData_X = QVector<double>::fromStdVector(x); // create graph and assign data to it: ui->plot->addGraph(); ui->plot->graph(0)->setData(this->plotData_X, this->plotData_Y); // give the axes some labels: ui->plot->xAxis->setLabel("x"); ui->plot->yAxis->setLabel("y"); // set axes ranges, so we see all data: ui->plot->xAxis->setRange(0, this->sampleRate); ui->plot->yAxis->setRange(4294945000, 4294970000); ui->plot->replot();
}
void MainWindow::on_bleScanButton_clicked()
{
m_bleInterface->scanDevices();}
void MainWindow::on_stopButton_clicked()
{
qDebug() << "stop button clicked";
fwriter->close_wave();
}void MainWindow::on_connectButton_clicked()
{
qDebug() << "connect button clicked";
m_bleInterface->set_currentDevice(ui->devicesComboBox->currentIndex());
m_bleInterface->connectCurrentDevice();
}void MainWindow::plotData(QByteArray data)
{
data.remove(0,1);qDebug() << data; qDebug() << data.size(); int pos = 0, arrsize = data.size(), sizeInArray = 3; QList<QByteArray> arrays; while(pos<arrsize){ QByteArray arr = data.mid(pos, sizeInArray); qDebug() << arr; uint32_t hrm = (arr[0] << 16) | (arr[1] << 8) | (arr[2]); qDebug() << QString::number(hrm); pos+=arr.size(); this->plotData_Y.removeFirst(); this->plotData_Y.append(hrm); ui->plot->graph(0)->setData(this->plotData_X, this->plotData_Y); ui->plot->replot(); }
}
void MainWindow::dataReceived(QByteArray data)
{
if(ui->asciiRadioButton->isChecked()){
ui->receivedTextEdit->append("\n");
ui->receivedTextEdit->append(data);
}
else{
ui->receivedTextEdit->append(data.toHex());
}uint8_t hrm = data.at(1); QString str_hrm = QString::number(hrm); ui->receivedTextEdit->append(str_hrm);
}
void MainWindow::on_servicesComboBox_currentIndexChanged(int index)
{
m_bleInterface->setCurrentService(index);
} -
@Ravi0101 said in QT Windows GUI main window freezes while running:
pos+=arr.size();
If for some reason arr.size() starts to return 0 you will not leave the loop.
Did you analyse your app? For example running through debugger and see where it hangs? Or at least add some debug output to see what happens. -
@Ravi0101 said in QT Windows GUI main window freezes while running:
could this be issue with the while loop in my code please?
Yes, it can. That is why I also suggested to add some debug output.
Please add a qDebug() output just after the loop and see whether you ever see it. If you don't then you have an endless loop. -
@jsulm please find below.
void MainWindow::plotData(QByteArray data)
{
auto count = data.size();
qDebug() << "bytearray size 1: " << count;
data.remove(0,1);
count = data.size();
qDebug() << "bytearray size 2: " << count;qDebug() << data; qDebug() << data.size(); int pos = 0, arrsize = data.size(), sizeInArray = 3; QList<QByteArray> arrays;
std::vector<uint32_t> hrm;
// std::vector<double> hrm_final;
// uint32_t old_hrm = 0;
while(pos<arrsize){
QByteArray arr = data.mid(pos, sizeInArray);
qDebug() << arr;
uint32_t hrm = (arr[0] << 16) | (arr[1] << 8) | (arr[2]);
qDebug() << QString::number(hrm);
// if(arrsize!=0){
pos+=arr.size();//plot with hrm diffference
// if(pos == 0)
// {
// old_hrm = hrm;
// continue;
// }
//else
// {
this->plotData_Y.removeFirst();//**plot with python code reference** //double hrm_final =(hrm / qPow(2,31)) * 10; //this->plotData_Y.append(hrm_final); // qDebug() << QString::number(hrm_final); //**plot with hrm difference** // this->plotData_Y.append(old_hrm-hrm); // qDebug() << QString::number(old_hrm-hrm); //**plot with original hrm** this->plotData_Y.append(hrm); ui->plot->graph(0)->setData(this->plotData_X, this->plotData_Y); // set axes ranges, so we see all data: ui->plot->replot(); } qDebug() << "not an endless loop"; }
//}