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

                                                  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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值