Введение
Допустим, у меня есть приложение с GUI, которое собирает некоторые данные от пользователя и затем вызывает встроенный сценарий python. Я хочу добавить «кнопку отмены» в случае, если пользователь хочет остановить процесс.
Примерный код
mainwindow
#include "calc_script.h"
signals:
void stopWorkSignal();
private:
calc_script *sender;
private slots:
Calculating()
on_pushButton_Cancel_clicked()
void MainWindow::Calculating()
{
QThread* newThread = new QThread();
connect(newThread, &QThread::started,
[=]() { sender->transfer(val_1, val_2, val_3); });
connect(this,
SIGNAL(stopWorkSignal()),
newThread,
SLOT(deleteLater())
newThread->start();
}
void MainWindow::on_pushButton_Cancel_clicked()
{
emit stopWorkSignal();
qDebug() << "stopwork signal emmitted";
}
calc_script.cpp
void calc_script::transfer(double val_1, double val_2, double val_3)
{
///Here the python (from boost.python) is executed
while(1) {}//this loop will generate a load to mimic this script, you cannot edit it, as the communication with .py is one-side at this lvl
}
Проблема Когда вызывается сигнал, я получаю ошибку QThread destroyed while thread is still running
(и кажется, что вычисления все еще продолжаются). Если я пройду SLOT(quit())
, ничего не произойдет. Если бы вычисление было простым l oop, я мог бы передать флаг, чтобы затормозить l oop. Но из-за вызова скрипта python я не могу этого сделать, поэтому я пытаюсь уничтожить поток, содержащий вычисления. Как правильно сделать описанную функциональность?
PS. Я знаю, что не включил весь вызов python, но он очень длинный. Для ошибки воспроизведения вы можете использовать любые не-l oop длинные вычисления внутри функции transfer
, в основном это будет та же самая ситуация.