From 10371d29f48a2ba7ae0898d1803ece5802884d53 Mon Sep 17 00:00:00 2001 From: Andrey Date: Mon, 24 Oct 2022 22:19:25 +0300 Subject: [PATCH] completed --- src/icons.qrc | 7 ++ src/icons/media-playback-pause.png | Bin 0 -> 1145 bytes src/icons/media-playback-start.png | Bin 0 -> 1177 bytes src/icons/media-playback-stop.png | Bin 0 -> 1165 bytes src/mainwindow.cpp | 61 ++++++++++++--- src/mainwindow.h | 20 +++-- src/mainwindow.ui | 114 ++++++++++++++++++++++++++--- src/pointgenerator.h | 50 +++++++++++++ 8 files changed, 229 insertions(+), 23 deletions(-) create mode 100644 src/icons.qrc create mode 100644 src/icons/media-playback-pause.png create mode 100644 src/icons/media-playback-start.png create mode 100644 src/icons/media-playback-stop.png create mode 100644 src/pointgenerator.h diff --git a/src/icons.qrc b/src/icons.qrc new file mode 100644 index 0000000..3184676 --- /dev/null +++ b/src/icons.qrc @@ -0,0 +1,7 @@ + + + icons/media-playback-pause.png + icons/media-playback-start.png + icons/media-playback-stop.png + + diff --git a/src/icons/media-playback-pause.png b/src/icons/media-playback-pause.png new file mode 100644 index 0000000000000000000000000000000000000000..5c7d128ee8728707a6193eb41af32b4e28890533 GIT binary patch literal 1145 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 literal 0 HcmV?d00001 diff --git a/src/icons/media-playback-stop.png b/src/icons/media-playback-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..650874f67f0ccb1b39591de96691b61f3c3bf98d GIT binary patch literal 1165 zcmV;81akX{P)kdg00002b3#c}2nbc| zMg#x=010qNS#tmY19kua19ky@)q>0b000?uMObuGZ)S9NVRB^vcXxL#X>MzCV_|S* zE^l&Yo9;Xs000CGNklrkmC6Jy9WesR^^K8P&yuG_6BOq91w;O z0FIbYMal#}U|XkRx6FwT6Tku#*>#;1HyPf+y_n^2g($1BtyaSfaR;8k6ZA~sI(gSC zc%vyhSu{W$FX5Pt^Vi%%4psu)qlr?gpwL-XKAv1R_HEJ~1I0WF4?Jpm~W5GYEj ztH#jhkPumvF9GJYitJ75H}MpnMT6lX9Y15XR54~N2ULy4d;0$f``E+=_o>u3cZcqz ztB)Df#=OsD0F^qVjg&%)$pL|--KDEznj~;+%&Pn%Kky?%Ctk&nW;j|!4e%6}nAfZ3nxTO315g7c|Bk-L zfaG<;pbU5l8X*cRv9L2JXw=|y1iD;xnjS1dKkxTfK@nT`F9Ew5D9F>4bh~(rnSG8{ z9IwEKi+b)Ufs3v5z@c9-(K+Snz+2!?KjqVA*sc&7?)`d7C_O6|h0Pt^l*|)UbjczO zpHqs6{c1tr{jM{Ly^B^h(GM`fHiqD-BOIzeI|&rCUIitq#~4@XO$B|~3_nj_UbE*a z_zsUE(wSO(Of&e;r{TG7?{D~uDlKGfEwz9w%aCkX=Os-r_7})Orh+paP4EeXiDW3t zT2Q`-u^N!^S6smWBcueERN)jwd!i#FYW(a`Q(s>b2 zBl1;=3cRN8@g?$5rZwm&>RT`nX;=;&DABsmLiTnzs1o-Ne$v fC9`oMo%a0)Lk#jiOZi|800000NkvXXu0mjfdhQk9 literal 0 HcmV?d00001 diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 49d64fc..a94f894 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1,14 +1,57 @@ #include "mainwindow.h" -#include "ui_mainwindow.h" +#include "qt5/ui_mainwindow.h" +#include "pointgenerator.h" -MainWindow::MainWindow(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::MainWindow) -{ - ui->setupUi(this); + +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { + ui->setupUi(this); + ui->buttonPause->setEnabled(false); + ui->buttonStart->setEnabled(true); + ui->buttonStop->setEnabled(false); + generator = new PointGenerator(); + connect(generator, &PointGenerator::newPoints, this, [this](QVector points){ + if (generator->isRunning() && !generator->isPause()) ui->graphic->setGraphicData(points); + }, Qt::QueuedConnection); + connect(generator, &PointGenerator::finished, this, [this](){ + ui->graphic->clear(); + ui->graphic->update(true); + }); } -MainWindow::~MainWindow() -{ - delete ui; + +MainWindow::~MainWindow() { + stopGenerator(); + delete generator; + delete ui; +} + + +void MainWindow::on_buttonStart_clicked() { + if (!generator->isRunning()) generator->start(); + ui->buttonPause->setEnabled(true); + ui->buttonStart->setEnabled(false); + ui->buttonStop->setEnabled(true); +} + + +void MainWindow::on_buttonStop_clicked() { + stopGenerator(); + ui->buttonPause->setEnabled(false); + ui->buttonStart->setEnabled(true); + ui->buttonStop->setEnabled(false); +} + + +void MainWindow::on_buttonPause_clicked() { + if (generator->isPause()) generator->resume(); + else generator->pause(); + ui->graphic->update(true); +} + + +void MainWindow::stopGenerator() { + generator->requestInterruption(); + if (generator->isPause()) generator->resume(); + generator->wait(); + ui->buttonPause->setChecked(false); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 9353441..6469f7f 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -3,20 +3,30 @@ #include + namespace Ui { class MainWindow; } +class PointGenerator; + class MainWindow : public QMainWindow { - Q_OBJECT - + Q_OBJECT public: - explicit MainWindow(QWidget *parent = nullptr); - ~MainWindow(); + explicit MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +private slots: + void on_buttonStart_clicked(); + void on_buttonStop_clicked(); + void on_buttonPause_clicked(); private: - Ui::MainWindow *ui; + void stopGenerator(); + + Ui::MainWindow *ui; + PointGenerator * generator; }; #endif // MAINWINDOW_H diff --git a/src/mainwindow.ui b/src/mainwindow.ui index 0a06936..8d60ce5 100644 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -1,9 +1,7 @@ + - - - MainWindow - + 0 @@ -13,12 +11,110 @@ - MainWindow + Strata Solutions Test - - - + + + + + + 4.000000000000000 + + + true + + + Graphic::Autofit|Graphic::Configure|Graphic::CursorAxis|Graphic::Fullscreen|Graphic::Save + + + true + + + false + + + -1.000000000000000 + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Start + + + + :/icons/media-playback-start.png:/icons/media-playback-start.png + + + + + + + Pause + + + + :/icons/media-playback-pause.png:/icons/media-playback-pause.png + + + true + + + + + + + Stop + + + + :/icons/media-playback-stop.png:/icons/media-playback-stop.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + - + + + Graphic + QFrame +
graphic.h
+
+
+ + +
diff --git a/src/pointgenerator.h b/src/pointgenerator.h new file mode 100644 index 0000000..591da9e --- /dev/null +++ b/src/pointgenerator.h @@ -0,0 +1,50 @@ +#ifndef POINTGENERATOR_H +#define POINTGENERATOR_H +#include +#include +#include +#include + + +class PointGenerator : public QThread { + Q_OBJECT +public: + void pause() { + mutex_pause.lock(); + is_pause = true; + } + + void resume() { + is_pause = false; + mutex_pause.unlock(); + } + + bool isPause() const {return is_pause;} + +private: + void run() override { + is_pause = false; + while(!isInterruptionRequested()) { + QThread::msleep(1); + QVector v; + v.resize(100); + for (QPointF & p : v) { + p = QPointF(QRandomGenerator::global()->generateDouble(), + QRandomGenerator::global()->generateDouble()); + } + emit newPoints(v); + if (is_pause) { + mutex_pause.lock(); + mutex_pause.unlock(); + } + } + } + + QMutex mutex_pause; + std::atomic_bool is_pause; + +signals: + void newPoints(QVector points); +}; + +#endif // POINTGENERATOR_H