From 6b1b599275d2f00f7a35f74b8b1fe745a1a57ced Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Sat, 19 Mar 2016 19:41:33 +0000 Subject: [PATCH] refs #623 Fixed CDataPageQueue performance. --- src/blackmisc/datacache.cpp | 27 ++++++++++++--------------- src/blackmisc/datacache.h | 4 ++-- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/blackmisc/datacache.cpp b/src/blackmisc/datacache.cpp index bed38e642..60d897d07 100644 --- a/src/blackmisc/datacache.cpp +++ b/src/blackmisc/datacache.cpp @@ -161,31 +161,28 @@ namespace BlackMisc auto *queue = new CDataPageQueue(page); connect(page, &CValuePage::valuesWantToCache, this, &CDataCache::changeValues); connect(this, &CDataCache::valuesChanged, queue, &CDataPageQueue::queueValuesFromCache, Qt::DirectConnection); - - auto *timer = new QTimer(page); - connect(timer, &QTimer::timeout, queue, &CDataPageQueue::trySetQueuedValuesFromCache); - timer->start(0); } void CDataPageQueue::queueValuesFromCache(const CValueCachePacket &values, QObject *changedBy) { QMutexLocker lock(&m_mutex); + if (m_queue.isEmpty()) + { + QTimer::singleShot(0, this, &CDataPageQueue::setQueuedValuesFromCache); + } m_queue.push_back(std::make_pair(values, changedBy)); } - void CDataPageQueue::trySetQueuedValuesFromCache() + void CDataPageQueue::setQueuedValuesFromCache() { - bool locked = m_mutex.tryLock(0); - if (locked) - { - decltype(m_queue) queue; - qSwap(m_queue, queue); - m_mutex.unlock(); + QMutexLocker lock(&m_mutex); + decltype(m_queue) queue; + qSwap(m_queue, queue); + lock.unlock(); - for (const auto &pair : queue) - { - m_page->setValuesFromCache(pair.first, pair.second); - } + for (const auto &pair : queue) + { + m_page->setValuesFromCache(pair.first, pair.second); } } diff --git a/src/blackmisc/datacache.h b/src/blackmisc/datacache.h index 214d00c68..b910717c8 100644 --- a/src/blackmisc/datacache.h +++ b/src/blackmisc/datacache.h @@ -40,8 +40,8 @@ namespace BlackMisc //! \threadsafe void queueValuesFromCache(const BlackMisc::CValueCachePacket &values, QObject *changedBy); - //! Synchronize with changes queued by queueValuesFromCache, if the mutex is not currently locked. - void trySetQueuedValuesFromCache(); + //! Synchronize with changes queued by queueValuesFromCache. + void setQueuedValuesFromCache(); //! Synchronize with one specific change in the queue, leave the rest for later. void setQueuedValueFromCache(const QString &key);