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;
}
作者:周顺利
这是我们公司的一个师兄缩写的消息队列,我这几天写一段代码要用到,所以看了以下,觉得很经典,//所以贴出来.
//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;
}
相关文章推荐
- 深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)
- 多线程环境下不安全的消息队列存取---线程不同步会造成隐患
- 深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)
- 深入浅出Win32多线程设计之MFC的多线程-线程与消息队列(经典)
- windows每个线程一个消息队列吗?
- 安全线程队列(四)
- 进程与线程(7) 进程间通信之消息队列
- 【详解】消息队列和线程关系
- Java多线程总结之线程安全队列Queue(2)
- Android消息队列及线程机制详解
- 细说UI线程和Windows消息队列
- window程序一个线程中可以有几个消息队列?和几个消息循环
- 消息队列NetMQ 原理分析3-命令产生/处理和回收线程
- Java多线程总结之线程安全队列Queue
- 【转】细说UI线程和Windows消息队列
- 利用线程来实现消息队列互发消息(示例代码)
- 菜鸟来解释线程中的循环者Looper读取消息队列
- 多线程15: 多线程十大经典案例之一 双线程读写队列数据
- 秒杀多线程第十六篇 多线程十大经典案例之一 双线程读写队列数据
- 细说UI线程和Windows消息队列