shared: Begin DirScanWorker
This commit is contained in:
parent
56414ee5e2
commit
f3fbf4a1dc
50
shared/dirscanworker.cpp
Normal file
50
shared/dirscanworker.cpp
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#include <QThread>
|
||||||
|
#include "dirscanworker.h"
|
||||||
|
#include "logger.h"
|
||||||
|
DirScanWorker::DirScanWorker(ConcurrentQueue<QString> &queue, ConcurrentQueue<QString> &resultQueue,
|
||||||
|
QStringList ignorePattern, unsigned int progressReportThreshold,
|
||||||
|
std::atomic<bool> &stopToken)
|
||||||
|
{
|
||||||
|
this->queue = &queue;
|
||||||
|
this->resultQueue = &resultQueue;
|
||||||
|
this->ignorePattern = ignorePattern;
|
||||||
|
this->progressReportThreshold = progressReportThreshold;
|
||||||
|
this->stopToken = &stopToken;
|
||||||
|
setAutoDelete(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DirScanWorker::run()
|
||||||
|
{
|
||||||
|
unsigned int currentProgress = 0;
|
||||||
|
QString path;
|
||||||
|
/* TODO: if we have e. g. only one path, then only one thread will scan this path.
|
||||||
|
*
|
||||||
|
* Thus, we must resubmit to the queue directories so other threads can help
|
||||||
|
the current one (requires a new logic for threads in ParallelDirScanner). Alterantively,
|
||||||
|
start new DirScanWorkers ourselves here... */
|
||||||
|
while(queue->dequeue(path))
|
||||||
|
{
|
||||||
|
QDirIterator iterator(path, ignorePattern, QDir::Files, QDirIterator::Subdirectories);
|
||||||
|
while(iterator.hasNext())
|
||||||
|
{
|
||||||
|
this->results.append(iterator.next());
|
||||||
|
++currentProgress;
|
||||||
|
if(currentProgress == progressReportThreshold)
|
||||||
|
{
|
||||||
|
if(this->stopToken->load(std::memory_order_relaxed))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->resultQueue->enqueue(this->results);
|
||||||
|
emit progress(results.length());
|
||||||
|
currentProgress = 0;
|
||||||
|
this->results.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this->resultQueue->enqueue(this->results);
|
||||||
|
emit progress(results.length());
|
||||||
|
this->results.clear();
|
||||||
|
emit finished();
|
||||||
|
}
|
31
shared/dirscanworker.h
Normal file
31
shared/dirscanworker.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#ifndef DIRSCANWORKER_H
|
||||||
|
#define DIRSCANWORKER_H
|
||||||
|
#include <QObject>
|
||||||
|
#include <QRunnable>
|
||||||
|
#include <QDirIterator>
|
||||||
|
#include "concurrentqueue.h"
|
||||||
|
class DirScanWorker : public QObject, public QRunnable
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
protected:
|
||||||
|
unsigned int progressReportThreshold = 1000;
|
||||||
|
ConcurrentQueue<QString> *queue = nullptr;
|
||||||
|
ConcurrentQueue<QString> *resultQueue = nullptr;
|
||||||
|
|
||||||
|
QStringList ignorePattern;
|
||||||
|
QVector<QString> results;
|
||||||
|
|
||||||
|
std::atomic<bool> *stopToken;
|
||||||
|
|
||||||
|
public:
|
||||||
|
DirScanWorker(ConcurrentQueue<QString> &queue, ConcurrentQueue<QString> &resultQueue, QStringList ignorePattern,
|
||||||
|
unsigned int progressReportThreshold, std::atomic<bool> &stopToken);
|
||||||
|
|
||||||
|
void run() override;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void progress(unsigned int);
|
||||||
|
void finished();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DIRSCANWORKER_H
|
Loading…
Reference in New Issue
Block a user