【问题标题】:Infinity Loop does not end when program is closed程序关闭时无限循环不会结束
【发布时间】: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::quitloopthread::waitloopthread::requestInterruptionloopthread::isInterruptionRequested 的定义,我们无法回答这个问题。另外,除了让你的代码用文本淹没控制台之外,找到一种方法来测试它,因为这可能会导致其他问题。例如。以 2 次/秒的速度打印您的消息。
  • @Tumbleweed53:这些都是QThread的功能……
  • @matthias-kawalek: closeEvent() 真的被调用了吗?我还会在 dtor 中添加一个 requestInterruption()
  • 根据您提供的代码,我创建了一个项目并且它可以工作。正如第一条评论所述,您的线程会用输出淹没控制台。如果我从控制台窗口启动应用程序,线程输出在关闭主窗口后立即停止。如果我从 Qt Creator 启动应用程序,则需要一段时间才能将完整的输出转储到“应用程序输出”窗口。您可以在每个控制台输出后添加几微秒的睡眠时间以避免泛滥。

标签: c++ qt subclass infinite-loop qthread


【解决方案1】:

感谢大家的帮助!

我设法解决了这个问题。 AS 说 run() 方法中的无限循环只是将消息发送到控制台。我通过让循环在没有任何任务的情况下运行来避免这种情况。 就我而言,我需要检查串行通信,因此使用信号 readyRead() 我现在可以读取此串行消息。因此循环执行,直到我停止应用程序。希望不要混淆太多。有时间我会发布我的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2013-09-30
    相关资源
    最近更新 更多