У меня есть 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
Как остановить петлю события в QThread? ⇐ C++
Программы на C++. Форум разработчиков
1758737144
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();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79772721/how-do-i-stop-an-event-loop-in-a-qthread[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия