代码之家  ›  专栏  ›  技术社区  ›  Nicolai Lissau

Qt:我应该在线程上运行QFileWatcher吗?

  •  0
  • Nicolai Lissau  · 技术社区  · 10 年前

    我有一个程序,它依赖于添加到文件夹中的文件。即使用户在此文件夹中添加了许多(>200)文件,也不能注销任何文件。

    当收到QFileWatcher发出的信号时,我正在读取并创建一些数据的图像,执行此操作可能需要几秒钟。QFileWatcher和处理信号的函数都位于同一类中。我担心这个类有时会很忙,可能会导致QFileWatcher无法注册一些文件。

    我应该将QFileWatcher添加到线程以确保数据注册吗?

    我现在在做什么

    在main.cpp中:

    ...
    MainWindow w;
    w.setupFolderMonitoring();
    ...
    

    在主窗口.h中:

    ...
    public:
      void setupFolderMonitoring();
      void detectFolderChanges();
    private:
      QString monitoredPath;
      QFileSystemWatcher watcher;
    ...
    

    在mainwindow.cpp中:

    ...
    void MainWindow::setupFolderMonitoring() {
        watcher.addPath(monitoredPath);
        QObject::connect(&watcher, SIGNAL(directoryChanged(QString)), this, 
        SLOT(detectFolderChanges()));
    }
    void MainWindow::detectFolderChanges() {
        qDebug() << "Dir was changed";
    }
    ...
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   deGoot    10 年前

    一般来说,如果数据处理时间可能超过一秒钟,那么可能不应该在主线程上执行,以避免无响应的GUI。

    此外,在Windows中进行文件夹监视时,我发现如果监视线程忙于处理数据,Windows文件监视机制将开始丢弃事件。因此,这是将数据处理转移到自己的线程的另一个很好的理由。

    我以前采用的方法是创建一个数据处理 QObject ,将其“移动”到新线程(使用 QObject::moveToThread(...) )并使用信号和插槽将其连接到文件系统监视器和GUI。

    老实说,我没有使用Qt的文件系统监控,因为我需要比Qt为文件重命名事件提供的信息更多的信息。所以我不得不直接使用Windows文件系统监视API。但我认为Qt无法解决操作系统在处理大规模更改方面的局限性。