Как остановить петлю события в QThread?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как остановить петлю события в QThread?

Сообщение Anonymous »

У меня есть QThread с каким -либо образом циклом. Мне нужно быть в состоянии остановить эту петлю. Я попытался излучать сигнал из основного потока, подключенного к слоту в qthread , который устанавливает переменную на TRUE и, таким образом, заканчивает цикл.
Проблема в том, что это соединение не работает. Я где -то читал, что соединения не выполняются, пока поток слота находится в занятой цикле. Итак, как мне обойти это и сказать ветке, чтобы он остановился? Хорошо, если цикл остановится перед окончанием текущей итерации. /> processor.hобразноеclass Processor : public QObject
{
Q_OBJECT

volatile bool processingStopped = false;

public:
Processor();

public slots:
/** @brief Process all files in pathList according to provided options. */
void process();

/** @brief Save received stop signal and stop processing. */
void stopProcess();
}
< /code>
processor.cpp
void Processor::process()
{
while (!processingStopped) {
// do some stuff
}
}

void Processor::stopProcess()
{
processingStopped = true;
qDebug("stop processing");
}
< /code>
mop.h
class Mop : public QObject
{
Q_OBJECT

QThread thread;

public:
Mop();
~Mop();

/** @brief Move a Processor to a QThread, connect signals, and start processing. */
template
void process(APP &app);

public slots:
/** @brief Quit the thread and wait(). */
void quit();

signals:
void startProcess();
};
< /code>
mop.tcc
template
void Mop::process(APP &app)
{
Processor *processor = new Processor();
processor->moveToThread(&thread);

connect(this, &Mop::startProcess, processor, &Processor::process);
connect(&thread, &QThread::finished, processor, &Processor::deleteLater);
connect(&app, &APP::stopProcess, processor, &Processor::stopProcess);

thread.start();
emit startProcess();
}
< /code>
mop.cpp
Mop::~Mop()
{
quit();
}

void Mop::quit()
{
thread.quit();
thread.wait();
}
< /code>
mainwindow.h
class MainWindow : public QMainWindow
{
Q_OBJECT

Mop mop;

void doProcess(const QStringList &paths);
void closeEvent(QCloseEvent *event) override;

signals:
void stopProcess();
}
< /code>
mainwindow.cpp
void MainWindow::closeEvent(QCloseEvent *event)
{
event->ignore();

if (QMessageBox::Yes == QMessageBox::question(this, "Close Confirmation", "Are you sure you want to quit?", QMessageBox::Yes | QMessageBox::No))
{
// Emit the signal to stop processing. The current loop will finish and then the thread will quit.
emit stopProcess();
event->accept();
}
}

// This is executed when a button is pressed
void MainWindow::doProcess(const QStringList &paths)
{
mop.process();
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... -a-qthread
Ответить

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

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

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

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

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