您的位置:首页 > 其它

BCB中的线程安全的消息队列(很经典)

2006-01-07 17:06 453 查看
BCB中的线程安全的消息队列(很经典)
作者:周顺利
这是我们公司的一个师兄缩写的消息队列,我这几天写一段代码要用到,所以看了以下,觉得很经典,//所以贴出来.
//Queue.h
#ifndef MessageQueueH
#define MessageQueueH
//---------------------------------------------------------------------------
#include <vcl.h>
#include "YSZ_NMS_c.hh"

class SCADAMessageQ
{
private:
TThreadList *m_pMessageList;
private:
void Clear(); //清空消息队列中的消息
SCADAMessageQ();
static SCADAMessageQ m_MessageQueue;
public:
~SCADAMessageQ();
int Add(const YSZ_NMS::SMessage &message); //往消息队列中添加一个函数
TList *GetMessageList(); //拷贝消息队列中的消息,清空消息队列中的消息
bool Empty(); //判断消息队列是否为空
public:
static SCADAMessageQ &GetMessageQueue();
};
#endif
//Queue.cpp
#pragma hdrstop
#include "SCADAMessageQ.h"
#include "YSZ_NMS_c.hh"
//---------------------------------------------------------------------------
#pragma package(smart_init)
SCADAMessageQ SCADAMessageQ::m_MessageQueue;
SCADAMessageQ::SCADAMessageQ()
{
m_pMessageList = new TThreadList;
}

SCADAMessageQ::~SCADAMessageQ()
{
Clear();
delete m_pMessageList;
m_pMessageList = NULL;
}

void SCADAMessageQ::Clear()
{
TList *pMessageList = m_pMessageList->LockList();
for (int i = 0; i < pMessageList->Count; i++)
{
delete (YSZ_NMS::SMessage *)pMessageList->Items[i];
}
pMessageList->Clear();
m_pMessageList->UnlockList();
}

int SCADAMessageQ::Add(const YSZ_NMS::SMessage &message)
{
TList *pMessageList = m_pMessageList->LockList();
YSZ_NMS::SMessage *pMessage = new YSZ_NMS::SMessage;
//pMessage->saddSource = message.saddSource;
//pMessage->seqDestination = message.seqDestination;
//pMessage->lMessage = message.lMessage;
//pMessage->seqPacket = message.seqPacket;
//pMessage->dTime = message.dTime;
pMessageList->Add(pMessage);
m_pMessageList->UnlockList();
return 0;
}

TList *SCADAMessageQ::GetMessageList()
{
TList *pMessageList = m_pMessageList->LockList();
TList *pResultList = new TList;
for (int i = 0; i < pMessageList->Count; i++)
{
pResultList->Add(pMessageList->Items[i]);
}
pMessageList->Clear();
m_pMessageList->UnlockList();
return pResultList;
}

bool SCADAMessageQ::Empty()
{
TList *pMessageList = m_pMessageList->LockList();
bool bEmpty = (0 == pMessageList->Count);
m_pMessageList->UnlockList();
return bEmpty;
}

SCADAMessageQ &SCADAMessageQ::GetMessageQueue()
{
return m_MessageQueue;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: