Use only one "directory contents counting" thread per process

The pointer to QThread object is stored in a global variable, and each
view increments/decrements a reference count when it starts/stops using
the thread. If this thread reaches zero, the thread is stopped.

Note that we cannot just use a smart pointer, like QSharedPointer, to
manage the thread, because we must make sure that the thread is not
running any more before the QThread is deleted.

REVIEW: 115064
This commit is contained in:
Frank Reininghaus 2014-01-21 19:07:58 +01:00
parent 419c7578f0
commit 55678afcc1
2 changed files with 20 additions and 7 deletions

View file

@ -30,7 +30,6 @@ KDirectoryContentsCounter::KDirectoryContentsCounter(KFileItemModel* model, QObj
QObject(parent),
m_model(model),
m_queue(),
m_workerThread(0),
m_worker(0),
m_workerIsBusy(false),
m_dirWatcher(0),
@ -39,25 +38,34 @@ KDirectoryContentsCounter::KDirectoryContentsCounter(KFileItemModel* model, QObj
connect(m_model, SIGNAL(itemsRemoved(KItemRangeList)),
this, SLOT(slotItemsRemoved()));
m_workerThread = new QThread(this);
if (!m_workerThread) {
m_workerThread = new QThread();
m_workerThread->start();
}
m_worker = new KDirectoryContentsCounterWorker();
m_worker->moveToThread(m_workerThread);
++m_workersCount;
connect(this, SIGNAL(requestDirectoryContentsCount(QString,KDirectoryContentsCounterWorker::Options)),
m_worker, SLOT(countDirectoryContents(QString,KDirectoryContentsCounterWorker::Options)));
connect(m_worker, SIGNAL(result(QString,int)),
this, SLOT(slotResult(QString,int)));
m_workerThread->start();
m_dirWatcher = new KDirWatch(this);
connect(m_dirWatcher, SIGNAL(dirty(QString)), this, SLOT(slotDirWatchDirty(QString)));
}
KDirectoryContentsCounter::~KDirectoryContentsCounter()
{
m_workerThread->quit();
m_workerThread->wait();
--m_workersCount;
if (m_workersCount == 0) {
m_workerThread->quit();
m_workerThread->wait();
delete m_workerThread;
m_workerThread = 0;
}
delete m_worker;
}
@ -162,3 +170,6 @@ void KDirectoryContentsCounter::startWorker(const QString& path)
m_workerIsBusy = true;
}
}
QThread* KDirectoryContentsCounter::m_workerThread = 0;
int KDirectoryContentsCounter::m_workersCount = 0;

View file

@ -78,7 +78,9 @@ private:
QQueue<QString> m_queue;
QThread* m_workerThread;
static QThread* m_workerThread;
static int m_workersCount;
KDirectoryContentsCounterWorker* m_worker;
bool m_workerIsBusy;