【问题标题】:Stop qt application in infinite loop when main window is closed关闭主窗口时在无限循环中停止 qt 应用程序
【发布时间】:2021-07-28 01:31:30
【问题描述】:

我的主要应用程序类是USB_Packet_Analyzer,它处理一些文件,但也支持从某人仍在写入的文件中读取。在这种情况下,我有一个无限循环来检查该文件中是否写入了新内容,如果是,我继续处理。在循环的每次迭代中,我都调用QCoreApplication::processEvents();。 问题是当我关闭应用程序的主窗口时,它不会停止应用程序。如果我检查QApplication::topLevelWidgets().size(),它仍然是1,而QApplication::topLevelWidgets().at(0)->isVisible() 是假的。为什么它不关闭我的窗口?我可以连接一些信号来检测窗口上的红十字是否被点击?我知道当进入这种循环时,我可能会使用QThread,但我不想参与其中。我的问题有什么解决办法吗?

【问题讨论】:

    标签: c++ qt infinite-loop


    【解决方案1】:

    您可以使用系统中断信号来管理布尔值以打破无限循环或退出应用程序。

    例如:

    #include <iostream>
    #include <csignal>
    
    using namespace std;
    
    void InterruptSignalHandler(int signal_number) {
        cout<< "Signal Number is "<<signal_number<<endl;
        exit(signal_number);
    }
    
    int main()
    {
        signal(SIGINT, InterruptSignalHandler);
        string a;
        while(true)
        {
            cout<<">";
            cin >> a;
        }
    
        return 0;
    }
    

    【讨论】:

      【解决方案2】:

      查看QFileSystemWatcher 类及其fileChanged 信号。

      #include <QFileSystemWatcher>
      
      class MainWindow : public QMainWindow
      {
          Q_OBJECT
      
      public:
          explicit MainWindow(QWidget *parent = 0);
      
      private:
          QFileSystemWatcher* fileWatcher;
          Ui::MainWindow*ui;
      };
      
      MainWindow::MainWindow(QWidget *parent) :
          QMainWindow(parent)
      {
          createUi();
                  
          fileWatcher = new QFileSystemWatcher(this);
          connect(fileWatcher, SIGNAL(fileChanged(QString)), this, SLOT(fileChangedSlot(QString)));
                  
          QFileInfo file("file_to_watch.txt");
              
          if (file.exists())
          {
              fileWatcher->addPath(file.absoluteFilePath());
          }
      }
              
      void MainWindow::fileChangedSlot(const QString &path)
      {
          if (fileWatcher->files().contains(path))
          {
              qDebug() << "File changed" << path;
          }
      }
      

      【讨论】:

      • 欢迎提供解决方案的链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的内容您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.
      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • 我认为这是解决这个问题的正确方法,但我有一个问题,fileChangedSlot 只有在我最小化我的类实现给定插槽的主窗口后才会被调用。知道为什么吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多