我有一个程序依赖于添加到文件夹的文件。即使用户将多个(> 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";
}
...
答案 0 :(得分:2)
一般情况下,如果您的数据处理时间超过一秒,您可能不应该在主线程上执行此操作以避免无响应的GUI。
此外,在Windows中处理文件夹监视时,我发现如果监视线程忙于处理数据,Windows文件监视机制将开始丢弃事件。这是将数据处理转移到它自己的线程的另一个好理由。
我之前采用的方法是创建数据处理QObject
,&#34;移动&#34;它到一个新线程(使用QObject::moveToThread(...)
)并使用信号和插槽将其连接到文件系统监视器和GUI。
说实话,我没有使用Qt的文件系统监控,因为我需要比Qt提供的文件重命名事件更多的信息。所以我必须直接使用Windows文件系统监控API。但是我不认为Qt可以在处理大规模变更方面解决操作系统中的限制。