mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-04-17 10:55:32 +08:00
refs #623 Fixed CDataPageQueue performance.
This commit is contained in:
@@ -161,31 +161,28 @@ namespace BlackMisc
|
|||||||
auto *queue = new CDataPageQueue(page);
|
auto *queue = new CDataPageQueue(page);
|
||||||
connect(page, &CValuePage::valuesWantToCache, this, &CDataCache::changeValues);
|
connect(page, &CValuePage::valuesWantToCache, this, &CDataCache::changeValues);
|
||||||
connect(this, &CDataCache::valuesChanged, queue, &CDataPageQueue::queueValuesFromCache, Qt::DirectConnection);
|
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)
|
void CDataPageQueue::queueValuesFromCache(const CValueCachePacket &values, QObject *changedBy)
|
||||||
{
|
{
|
||||||
QMutexLocker lock(&m_mutex);
|
QMutexLocker lock(&m_mutex);
|
||||||
|
if (m_queue.isEmpty())
|
||||||
|
{
|
||||||
|
QTimer::singleShot(0, this, &CDataPageQueue::setQueuedValuesFromCache);
|
||||||
|
}
|
||||||
m_queue.push_back(std::make_pair(values, changedBy));
|
m_queue.push_back(std::make_pair(values, changedBy));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDataPageQueue::trySetQueuedValuesFromCache()
|
void CDataPageQueue::setQueuedValuesFromCache()
|
||||||
{
|
{
|
||||||
bool locked = m_mutex.tryLock(0);
|
QMutexLocker lock(&m_mutex);
|
||||||
if (locked)
|
decltype(m_queue) queue;
|
||||||
{
|
qSwap(m_queue, queue);
|
||||||
decltype(m_queue) queue;
|
lock.unlock();
|
||||||
qSwap(m_queue, queue);
|
|
||||||
m_mutex.unlock();
|
|
||||||
|
|
||||||
for (const auto &pair : queue)
|
for (const auto &pair : queue)
|
||||||
{
|
{
|
||||||
m_page->setValuesFromCache(pair.first, pair.second);
|
m_page->setValuesFromCache(pair.first, pair.second);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,8 +40,8 @@ namespace BlackMisc
|
|||||||
//! \threadsafe
|
//! \threadsafe
|
||||||
void queueValuesFromCache(const BlackMisc::CValueCachePacket &values, QObject *changedBy);
|
void queueValuesFromCache(const BlackMisc::CValueCachePacket &values, QObject *changedBy);
|
||||||
|
|
||||||
//! Synchronize with changes queued by queueValuesFromCache, if the mutex is not currently locked.
|
//! Synchronize with changes queued by queueValuesFromCache.
|
||||||
void trySetQueuedValuesFromCache();
|
void setQueuedValuesFromCache();
|
||||||
|
|
||||||
//! Synchronize with one specific change in the queue, leave the rest for later.
|
//! Synchronize with one specific change in the queue, leave the rest for later.
|
||||||
void setQueuedValueFromCache(const QString &key);
|
void setQueuedValueFromCache(const QString &key);
|
||||||
|
|||||||
Reference in New Issue
Block a user