我有一个主线程和一个处理一些文件的线程。当主线程监视的文件夹发生更改时,会向处理线程发送信号以启动。处理完文件后,我希望将其删除,然后让文件夹检查文件夹中是否还有其他文件。如果有则重复该过程。
我的问题在于重复检查文件夹。在处理线程上。该功能列在下面的代码中,问题是我无法从文件夹中删除文件。我很困难,所以任何投入都值得赞赏。
在dataprocessor.h
...
QList<QString> justProcessed;
...
在dataprocessor.cpp中
void DataProcessor::onSignal() {
// Will keep running as long as there are files in the spool folder, eating it's way through
bool stillFiles = true;
QDir dir(this->monitoredPath);
dir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
dir.setSorting(QDir::Time);
while(stillFiles) {
// Have to update on each iteration, since the folder changes.
dir.refresh();
QFileInfoList fileList = dir.entryInfoList();
QString activeFile = "";
foreach(QFileInfo file, fileList) {
if((file.suffix() == "txt") && !justProcessed.contains(file.fileName())) {
// Is a text file. Set for processing and break foreach loop
activeFile = file.fileName();
break;
}
}
// If none of the files passed the requirements, then there are no more spl files in the folder.
qDebug() << activeFile;
if(activeFile == "") {
qDebug() << "Finished";
emit finished();
stillFiles = false;
}
// File is a new file, start processing
qDebug() << "Selected for processing";
qDebug() << monitoredPath + "/" + activeFile;
if(!dir.remove(monitoredPath + "/" + activeFile)) qDebug() << "Could not remove file";
justProcessed.append(activeFile);
} // While end
}
如果我错过了提供一些信息,请告诉我。
答案 0 :(得分:0)
问题原来是两个问题。其中一个问题是系统太快,因此在读取和删除系统的同时删除文件。我通过添加QTimer解决了这个问题,每次触发来自受监视文件夹的信号时都会重置该QTimer。从最后一次更换系统起500ms就足够了。而不是继续使用QFileSystemWatcher读取此文件夹中的文件并将其添加到队列中,就像我最初一样,我创建了一个函数来处理文件夹中的文件时使系统观察器静音。为了补偿文件观察器的功能,我在处理线程中创建了一个递归循环,这样只要还有文件,它就会继续读取指定的文件。这可以在一个线程中完成。你们都谈论代码,所以这里是:
信号和插槽设置
// Setting up folder monitoring.
watcher.addPath(worker->monitoredPath);
QObject::connect(&watcher, SIGNAL(directoryChanged(QString)), this,
SLOT(updateQueue()));
// Timer
connect(timer, SIGNAL(timeout()), this, SLOT(startProcess()));
connect(this, SIGNAL(processRequest()), thread, SLOT(start()));
...
void MainWindow::updateQueue() {
// Starts or restarts the call to start process. Prevents multiple signals from
// many files added at once
timer->start(500);
}
...
void MainWindow::startProcess() {
if(!thread->isRunning()) {
emit processRequest();
muteWatcher(true); // From here on a recursive loop in dataprocessor checks
// the folder for new files.
}
timer->stop();
}
静音文件观察器
void MainWindow::muteWatcher(bool toggle) {
if(toggle) {
watcher.removePath(worker->monitoredPath);
} else {
watcher.addPath(worker->monitoredPath);
}
}
处理线程
void DataProcessor::initialize() {
QDir dir(this->monitoredPath);
dir.setFilter(QDir::NoDotAndDotDot | QDir::Files);
dir.setSorting(QDir::Time);
QList<QString> dFiles;
foreach(QFileInfo file, dir.entryInfoList()) {
if(file.suffix().toLower() == "txt") {
dFiles.append(file.fileName());
}
}
if(dFiles.count() == 0) { // Base case
emit muteWatcher(false); // Start monitoring the folder again
emit finished(); // end the thread
return true;
}
// PROCESSING HERE
initializeLabel();
}
接下来要去的是我打印到的打印机的首选项,以防止此打印机将假脱机文件添加到该文件夹。您可以通过单击“直接打印到打印机”来启用此功能。这解决了我的大多数问题,并且我能够删除我创建的延迟网络,以便使程序不会阅读打印机生成的文件。
希望这有助于某人!