在 qt 中使用 QThread 实现启动/停止/暂停
Posted
技术标签:
【中文标题】在 qt 中使用 QThread 实现启动/停止/暂停【英文标题】:implementation of start/stop/pause using QThread in qt 【发布时间】:2021-05-02 07:06:14 【问题描述】:我是 qt 的新手。我有一个使用 QThreads 执行阶乘计算的示例,使用 gui 我应该能够开始/停止/暂停计算。我可以通过在 run 方法中定义逻辑来启动应用程序,如下所示。
#ifndef FACTORIALCALCULATOR_H
#define FACTORIALCALCULATOR_H
#include <QThread>
class FactorialCalculator : public QThread
public:
FactorialCalculator();
int inputNumber;
long resultFactorial;
private:
virtual void run();
long calculateFactorial(int input);
;
#endif // FACTORIALCALCULATOR_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "factorialcalculator.h";
#include "erathosthenesprimenumbercalculator.h";
FactorialCalculator factorialCalculator;
bool isSuspend = false;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
ui->setupUi(this);
factorialCalculator.inputNumber = ui->lineEditFactorial->text().toInt();
ui->resultFactorial->setText(QString(" %1 ").arg(factorialCalculator.resultFactorial));
MainWindow::~MainWindow()
delete ui;
void MainWindow::on_startFactorial_clicked()
factorialCalculator.inputNumber = ui->lineEditFactorial->text().toInt();
factorialCalculator.start();
ui->resultFactorial->setText(QString(" %1 ").arg(factorialCalculator.resultFactorial));
#include "factorialcalculator.h"
#include <iostream>
#include <QDebug>
bool isRunning =false;
FactorialCalculator::FactorialCalculator()
void FactorialCalculator::run()
// calculateFactorial(inputNumber);
qDebug() << resultFactorial;
// FactorialCalculator().sleep(2000);
long FactorialCalculator::calculateFactorial(int input)
int n = input;
unsigned long long factorial = 1;
// qDebug() << "Enter a positive integer: ";
// cin >> n;
if (n < 0)
qDebug() << "Error! Factorial of a negative number doesn't exist.";
else
for(int i = 1; i <=n; ++i)
factorial *= i;
qDebug() << "Factorial of " << n << " = " << factorial;
FactorialCalculator().sleep(2000);
resultFactorial = factorial;
return factorial;
但我需要实现暂停和停止功能。我该怎么做,任何伪代码都会有所帮助。
【问题讨论】:
【参考方案1】:在FactorialCalculator
类内创建pauseResumeCalculation
槽,添加代表计算状态的布尔成员变量isRunning
,在槽pauseResumeCalculation
内切换其值,在run()
内循环运行计算并定期调用qApp->processEvents()
并检查isRunning
的值并根据值进行睡眠或计算。添加槽stopCalculation
和变量stopRequested
,检查其在run()
循环中的值,如果设置为true则退出。在主线程对象中创建信号并将它们连接到pauseResumeCalculation
和stopCalculation
。
【讨论】:
每当我尝试运行上述程序时,我在 mainwindow.cpp 中得到 resultFactorial 变量为零? 你得到了变量的初始值,因为计算还没有完成。要将结果传递给MainWindow
,请将信号添加到FactorialCalculator
,连接到MainWindow
中的插槽,并在计算完成时发出。
能否请您提供一些示例代码以上是关于在 qt 中使用 QThread 实现启动/停止/暂停的主要内容,如果未能解决你的问题,请参考以下文章
g_main_loop_run 阻塞 Qthread 并且不允许停止视频