【发布时间】:2021-04-08 14:52:41
【问题描述】:
我的QThread subclass 的运行方法中有一个无限循环。该线程应该存在,直到应用程序关闭。代码看起来像这样。
loopThread.h:
class loopThread : public QThread
{
Q_OBJECT
public:
loopThread();
~loopThread();
protected:
void run() override;
signals:
void resultReady();
};
子类的实现如下:
loopThread.cpp:
void loopThread::run()
{ while(!this->isInterruptionRequested()){
std::cout << "loop active" << std::endl; //checking if it executes the loop or not
}
}
run()-method 执行无限循环,直到在 mainWindow class 中调用 requesInterruption()。
MainWindow.h:
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void closeEvent(QCloseEvent *event);
private:
Ui::MainWindow *ui;
loopThread *loopThread = nullptr;
public slots:
void handleResult();
};
这个类的实现说
MainWindow.cpp:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
loopThread = new loopThread();
connect(loopThread, &loopThread::noButtonClicked, this, &loopThread::NoButton);
connect(loopThread, &loopThread::finished, loopThread, &loopThread::deleteLater);
loopThread->start();
}
MainWindow::~MainWindow()
{
loopThread->quit();
loopThread->wait();
delete ui;
}
void MainWindow::closeEvent(QCloseEvent *event)
{
loopThread->requestInterruption();
}
所以我建议当我通过单击窗口中的“X”关闭应用程序时,循环应该结束并且程序应该停止。问题是即使在关闭窗口后,控制台也会给我“循环活动”消息,所以循环仍然继续。我的错在哪里。有没有办法在程序关闭时让循环结束?
将QObject 移动到线程的解决方案会产生同样的问题。
【问题讨论】:
-
如果没有看到
loopthread::quit、loopthread::wait、loopthread::requestInterruption和loopthread::isInterruptionRequested的定义,我们无法回答这个问题。另外,除了让你的代码用文本淹没控制台之外,找到一种方法来测试它,因为这可能会导致其他问题。例如。以 2 次/秒的速度打印您的消息。 -
@Tumbleweed53:这些都是QThread的功能……
-
@matthias-kawalek: closeEvent() 真的被调用了吗?我还会在 dtor 中添加一个 requestInterruption()
-
根据您提供的代码,我创建了一个项目并且它可以工作。正如第一条评论所述,您的线程会用输出淹没控制台。如果我从控制台窗口启动应用程序,线程输出在关闭主窗口后立即停止。如果我从 Qt Creator 启动应用程序,则需要一段时间才能将完整的输出转储到“应用程序输出”窗口。您可以在每个控制台输出后添加几微秒的睡眠时间以避免泛滥。
标签: c++ qt subclass infinite-loop qthread