Files
QTradeProgram/TradingCore/utilities/ObjectPool.h

201 lines
4.8 KiB
C
Raw Normal View History

2026-02-25 23:01:42 +08:00
#pragma once
#include <QVector>
#include <QMutex>
#include <QSharedPointer>
#include <functional>
#include "BZStruct.h"
/**
* @brief
*/
template<typename T>
class ObjectPool {
public:
ObjectPool(size_t initialSize = 100, size_t maxSize = 1000)
: m_maxSize(maxSize) {
// 预分配初始对象
for (size_t i = 0; i < initialSize; ++i) {
m_pool.append(new T());
}
}
~ObjectPool() {
QMutexLocker lock(&m_mutex);
for (auto obj : m_pool) {
delete obj;
}
m_pool.clear();
}
/**
* @brief
*/
QSharedPointer<T> acquire() {
QMutexLocker lock(&m_mutex);
if (!m_pool.isEmpty()) {
T* obj = m_pool.takeLast();
return QSharedPointer<T>(obj, [this](T* obj) { this->release(obj); });
} else if (m_totalCreated < m_maxSize) {
m_totalCreated++;
T* obj = new T();
return QSharedPointer<T>(obj, [this](T* obj) { this->release(obj); });
}
// 如果池为空且达到最大限制,创建临时对象(不会被回收)
return QSharedPointer<T>(new T());
}
/**
* @brief
*/
size_t size() const {
QMutexLocker lock(&m_mutex);
return m_pool.size();
}
/**
* @brief
*/
size_t totalCreated() const {
QMutexLocker lock(&m_mutex);
return m_totalCreated;
}
private:
void release(T* obj) {
QMutexLocker lock(&m_mutex);
if (m_pool.size() < m_maxSize) {
// 重置对象状态
*obj = T();
m_pool.append(obj);
} else {
delete obj;
}
}
private:
QVector<T*> m_pool;
mutable QMutex m_mutex;
size_t m_maxSize;
size_t m_totalCreated = 0;
};
/**
* @brief BigOrderInfo对象池单例
*/
class BigOrderInfoPool {
public:
static BigOrderInfoPool& instance() {
static BigOrderInfoPool pool;
return pool;
}
QSharedPointer<BigOrderInfo> acquire() {
return m_pool.acquire();
}
size_t poolSize() const {
return m_pool.size();
}
size_t totalCreated() const {
return m_pool.totalCreated();
}
private:
BigOrderInfoPool() : m_pool(100, 500) {} // 初始100个最大500个
private:
ObjectPool<BigOrderInfo> m_pool;
};
/**
* @brief 使
*/
class MemoryMonitor {
public:
static MemoryMonitor& instance() {
static MemoryMonitor monitor;
return monitor;
}
/**
* @brief
*/
void recordAllocation(size_t bytes, const QString& type) {
QMutexLocker lock(&m_mutex);
m_allocatedMemory[type] += bytes;
m_totalAllocated += bytes;
// 检查内存使用是否超过阈值
if (m_totalAllocated > m_memoryThreshold && !m_alertTriggered) {
emitMemoryAlert();
}
}
/**
* @brief
*/
void recordDeallocation(size_t bytes, const QString& type) {
QMutexLocker lock(&m_mutex);
m_allocatedMemory[type] -= bytes;
m_totalAllocated -= bytes;
}
/**
* @brief 使
*/
QMap<QString, size_t> getMemoryUsage() const {
QMutexLocker lock(&m_mutex);
return m_allocatedMemory;
}
/**
* @brief 使
*/
size_t getTotalMemoryUsage() const {
QMutexLocker lock(&m_mutex);
return m_totalAllocated;
}
/**
* @brief
*/
void setMemoryThreshold(size_t threshold) {
QMutexLocker lock(&m_mutex);
m_memoryThreshold = threshold;
}
private:
void emitMemoryAlert() {
m_alertTriggered = true;
// 这里可以发送信号或记录日志
qWarning() << "Memory usage alert: Total allocated" << m_totalAllocated << "bytes";
// 记录内存使用详情
for (auto it = m_allocatedMemory.begin(); it != m_allocatedMemory.end(); ++it) {
if (it.value() > 0) {
qWarning() << " " << it.key() << ":" << it.value() << "bytes";
}
}
}
private:
mutable QMutex m_mutex;
QMap<QString, size_t> m_allocatedMemory;
size_t m_totalAllocated = 0;
size_t m_memoryThreshold = 100 * 1024 * 1024; // 100MB默认阈值
bool m_alertTriggered = false;
};
// 内存分配跟踪宏
#ifdef MEMORY_TRACKING
#define TRACK_MEMORY_ALLOC(bytes, type) MemoryMonitor::instance().recordAllocation(bytes, type)
#define TRACK_MEMORY_FREE(bytes, type) MemoryMonitor::instance().recordDeallocation(bytes, type)
#else
#define TRACK_MEMORY_ALLOC(bytes, type)
#define TRACK_MEMORY_FREE(bytes, type)
#endif