// TraceListBox.cpp : 实现文件
//
#include "stdafx.h"
#include "TraceListBox.h"
#define WM_ADDLISTMSG (WM_USER+1)
// CTraceListBox
IMPLEMENT_DYNAMIC(CTraceListBox, CListBox)
CTraceListBox::CTraceListBox()
{
}
CTraceListBox::~CTraceListBox()
{
}
BEGIN_MESSAGE_MAP(CTraceListBox, CListBox)
ON_MESSAGE(WM_ADDLISTMSG, OnAddMessage)
END_MESSAGE_MAP()
// CTraceListBox 消息处理程序
tagMsgBuffer* CTraceListBox::ActiveMsgBuffer()
{
CLock<CLockCriticalSection> lock(&m_LockFreeBuffer);
tagMsgBuffer* pMsgBuffer = NULL;
if (m_vecFreeBuffer.size() > 0)
{
tagMsgBuffer* pMsgBuffer = m_vecFreeBuffer[0];
m_vecFreeBuffer.erase(m_vecFreeBuffer.begin());
//TRACE("获取对象 pMsgBuffer:%p size:%d\n",pMsgBuffer,m_vecFreeBuffer.size());
ZeroMemory(pMsgBuffer, sizeof(tagMsgBuffer));
return pMsgBuffer;
}
pMsgBuffer = new tagMsgBuffer;
TRACE("新建对象 pMsgBuffer:%p %d\n", pMsgBuffer, m_vecFreeBuffer.size());
ZeroMemory(pMsgBuffer, sizeof(tagMsgBuffer));
return pMsgBuffer;
}
void CTraceListBox::FreeMsgBuffer(tagMsgBuffer* pMsgBuffer)
{
CLock<CLockCriticalSection> lock(&m_LockFreeBuffer);
if (m_vecFreeBuffer.size() > MAX_CACHE)
{
TRACE("销毁对象 pMsgBuffer:%p size:%d\n", pMsgBuffer, m_vecFreeBuffer.size());
delete pMsgBuffer;
return;
}
//TRACE("释放对象 pMsgBuffer:%p size:%d\n",pMsgBuffer,m_vecFreeBuffer.size());
m_vecFreeBuffer.push_back(pMsgBuffer);
}
void CTraceListBox::AddString(LPCTSTR lpMsg)
{
if (GetSafeHwnd() == NULL)
{
return;
}
tagMsgBuffer* pMsgBuffer = ActiveMsgBuffer();
lstrcpyn(pMsgBuffer->szBuffer, lpMsg, MAX_MSG_LEN);
ASSERT(pMsgBuffer->szBuffer[MAX_MSG_LEN] == 0);
PostMessage(WM_ADDLISTMSG, (WPARAM)pMsgBuffer, 0);
}
LRESULT CTraceListBox::OnAddMessage(WPARAM wParam, LPARAM lParam)
{
tagMsgBuffer* p = (tagMsgBuffer*)wParam;
int idx = CListBox::GetCount();
if (idx > MAX_REC_LINE)
{
ResetContent();
idx = 0;
}
idx = CListBox::InsertString(idx, p->szBuffer);
CListBox::SetCurSel(idx);
FreeMsgBuffer(p);
return 0;
}
void CTraceListBox::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
AddString("已经调用了 CTraceListBox");
CListBox::PreSubclassWindow();
}
void CTraceListBox::PostNcDestroy()
{
// TODO: 在此添加专用代码和/或调用基类
for (int i = 0; i < m_vecFreeBuffer.size();i++)
{
delete m_vecFreeBuffer[i];
}
CListBox::PostNcDestroy();
}