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

时间:2014-03-29 12:56:16

标签: c++ multithreading qt qthread

我有一个程序依赖于添加到文件夹的文件。即使用户将多个(> 200)文件添加到此文件夹,也不能取消注册任何文件。

当收到来自QFileWatcher的信号时,我正在读取并从某些数据中创建图像,执行此操作可能需要几秒钟。 QFileWatcher和处理信号的函数都驻留在同一个类中。我担心该课程有时可能会很忙,并可能导致QFileWatcher不注册某些文件。

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

截至目前我正在做什么

在main.cpp中:

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

在mainwindow.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 个答案:

答案 0 :(得分:2)

一般情况下,如果您的数据处理时间超过一秒,您可能不应该在主线程上执行此操作以避免无响应的GUI。

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

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

说实话,我没有使用Qt的文件系统监控,因为我需要比Qt提供的文件重命名事件更多的信息。所以我必须直接使用Windows文件系统监控API。但是我不认为Qt可以在处理大规模变更方面解决操作系统中的限制。