Сбой при использовании обратных вызовов для отделения серверной части от графического интерфейса.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Сбой при использовании обратных вызовов для отделения серверной части от графического интерфейса.

Сообщение Anonymous »

Я пытаюсь устранить проблему, с которой столкнулся при попытке отделить серверную часть от графического пользовательского интерфейса. Первоначально я успешно реализовал многопоточность в одном основном классе wxFrame на основе этого руководства: wx_stdthread_tutorial. Я работаю на Linux Mint, а IDE — Clion.
Теперь мой код выглядит так:

Код: Выделить всё

//main.cpp MainFrame constructor, svc_ is the BackendService object

svc_.setProgressCallback([this](const Progress & p) {
wxApp::GetInstance() -> CallAfter([this, p]() {
this -> gaugeActive -> SetValue(p.percent);
//if (p.percent == 100) {
if (p.status == "Done") {
this -> OnStopSvc();
}
});
});

Код: Выделить всё

//main.cpp

void MainFrame::OnButtonStartActive(wxCommandEvent& event) {
if (!this->processing)
{
this->processing = true;
svc_.startLongTask();
}
}
void MainFrame::OnStopSvc()
{
this->processing = false;
svc_.stop();
}

Код: Выделить всё

//Backend.cpp

#include "backend.h"
#include 

BackendService::BackendService() : running_(false) {}
BackendService::~BackendService() { stop(); }

void BackendService::setProgressCallback(ProgressCb cb) {
progressCb_ = std::move(cb);
}

void BackendService::startLongTask() {
if (running_) return;
running_ = true;
workerThread_ = std::thread(&BackendService::workerLoop, this);
}

void BackendService::stop() {
if (!running_) return;
running_ = false;
if (workerThread_.joinable()) workerThread_.join();
}

void BackendService::workerLoop() {
for (int i = 0; i 

Подробнее здесь: [url]https://stackoverflow.com/questions/79846494/crash-when-using-callbacks-to-separate-backend-from-the-gui[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»