mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-17 15:31:20 +00:00
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:
parent
419c7578f0
commit
55678afcc1
|
@ -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;
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue