From 0d3b84accf4670cb14516f2cd9c7e9a98bfc7f78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=A1=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2?= Date: Thu, 25 May 2023 19:06:49 +0300 Subject: [PATCH] add some async in client --- client/internal/gui/include/SolutionsWindow.h | 30 +++++++++++++++++++ client/internal/gui/src/SolutionsWindow.cpp | 23 ++++++++++++-- .../internal/httpClient/include/HttpClient.h | 2 ++ client/internal/httpClient/src/HttpClient.cpp | 6 +++- 4 files changed, 57 insertions(+), 4 deletions(-) diff --git a/client/internal/gui/include/SolutionsWindow.h b/client/internal/gui/include/SolutionsWindow.h index df2f09d..889c007 100755 --- a/client/internal/gui/include/SolutionsWindow.h +++ b/client/internal/gui/include/SolutionsWindow.h @@ -10,8 +10,36 @@ #include #include #include +#include #include "Task.h" #include "TasksWindow.h" +#include "Solution.h" +#include "Core.h" + +class SolutionDownloadTask : public QObject { +Q_OBJECT +public: + SolutionDownloadTask(const int& task_id, const std::string& filename, const std::string& path_to_file) + : task_id(task_id), filename(filename), path_to_file(path_to_file) {} + + ~SolutionDownloadTask() { + qDebug() << "DownloadTask die"; + } + +public slots: + void Start() { + std::pair result = Core::submitSolution(task_id, filename, path_to_file); + emit Ready(result); + } + +signals: + void Ready(std::pair data); + +private: + int task_id; + std::string filename; + std::string path_to_file; +}; class SolutionsWindow : public QMainWindow { Q_OBJECT @@ -23,6 +51,7 @@ private slots: void on_backButton_clicked(); void on_chooseFileButton_clicked(); void on_sendButton_clicked(); + void on_solutionData_ready(std::pair data); private: @@ -45,6 +74,7 @@ private: QTextEdit* original = nullptr; QLabel* currentLabel = nullptr; QTextEdit* current = nullptr; + QThread thread; void setupUi(QMainWindow *UserWindow); }; diff --git a/client/internal/gui/src/SolutionsWindow.cpp b/client/internal/gui/src/SolutionsWindow.cpp index 1e5cc81..a4ff2ea 100755 --- a/client/internal/gui/src/SolutionsWindow.cpp +++ b/client/internal/gui/src/SolutionsWindow.cpp @@ -13,6 +13,7 @@ SolutionsWindow::SolutionsWindow(Task task, QWidget *parent) : QMainWindow(paren connect(backButton, &QPushButton::clicked, this, &SolutionsWindow::on_backButton_clicked); connect(chooseFileButton, &QPushButton::clicked, this, &SolutionsWindow::on_chooseFileButton_clicked); connect(sendButton, &QPushButton::clicked, this, &SolutionsWindow::on_sendButton_clicked); + thread.start(); } void SolutionsWindow::setupUi(QMainWindow *SolutionsWindow) { @@ -94,12 +95,28 @@ void SolutionsWindow::on_sendButton_clicked() { QMessageBox::warning(this, "Ошибка отправки", "Файл должен быть указан"); return; } + + SolutionDownloadTask* downloadTask; + downloadTask = new SolutionDownloadTask(task.id, filename->text().toUtf8().constData(), path_to_file); + downloadTask->moveToThread(&thread); + + connect(downloadTask, &SolutionDownloadTask::Ready, this, &SolutionsWindow::on_solutionData_ready); + connect(downloadTask, &SolutionDownloadTask::Ready, downloadTask, &QObject::deleteLater); + + QMetaObject::invokeMethod(downloadTask, [downloadTask]() { + downloadTask->Start(); + }); + + result->setText(QString::fromStdString("Файл отправлен, идет обработка")); +} + +void SolutionsWindow::on_solutionData_ready(std::pair data) { Solution sol; Solution::Codes codes; - std::tie(sol, codes) = Core::submitSolution(task.id, filename->text().toUtf8().constData(), path_to_file); + std::tie(sol, codes) = data; result->setText(QString::fromStdString(sol.result)); - original->setHtml(QString::fromUtf8(codes.original)); - current->setHtml(QString::fromUtf8(codes.current)); + original->setHtml(QString::fromStdString(codes.original)); + current->setHtml(QString::fromStdString(codes.current)); } diff --git a/client/internal/httpClient/include/HttpClient.h b/client/internal/httpClient/include/HttpClient.h index 42c5f6d..bfa2d5c 100755 --- a/client/internal/httpClient/include/HttpClient.h +++ b/client/internal/httpClient/include/HttpClient.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -30,6 +31,7 @@ private: beast::tcp_stream stream; std::string host; std::string port; + std::mutex mutex; }; diff --git a/client/internal/httpClient/src/HttpClient.cpp b/client/internal/httpClient/src/HttpClient.cpp index 2dd0245..4c35236 100755 --- a/client/internal/httpClient/src/HttpClient.cpp +++ b/client/internal/httpClient/src/HttpClient.cpp @@ -12,7 +12,11 @@ HttpClient::HttpClient(std::string_view host_, std::string_view port_) : http::response HttpClient::makeRequest(std::string_view target, http::verb method, std::string_view body) { - auto const results = resolver.resolve(host, port); + tcp::resolver::results_type results; + { + std::lock_guard _{mutex}; + results = resolver.resolve(host, port); + } stream.connect(results); http::request req{http::verb::get, target, 11}; req.set(http::field::host, host); -- GitLab