diff --git a/client/internal/gui/include/SolutionsWindow.h b/client/internal/gui/include/SolutionsWindow.h index df2f09db91bb0346b03a4d15a0f7d0bea3370b9c..889c0072e7aa73602623a373fbff21ca40ca0294 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 1e5cc813471215351f65dab7d80e5b04c622b738..a4ff2ea5bf4d5e2d8d7ae06bdc6c2742fa931a91 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 42c5f6dcaf17be01c356a07040684fae932bb308..bfa2d5cfdb4dff34256fbc1de1e238f58d6ab0a1 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 2dd02453ad3ba76c2e309a8e637f7eadee6339db..4c352363eaf6c0d1d5e83a770c350810085620e6 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);