`
sogo6
  • 浏览: 110664 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ACE消息队列的示例代码

阅读更多
#include "ace/ACE.h"
#include "ace/OS.h"
#include "ace/Synch.h"
#include "ace/Message_Queue_T.h"
#include "ace/Thread_Mutex.h"
#include "ace/Thread_Manager.h"
#include <iostream>

struct MYMSG
{
    int version;
    int sn;
    char *context;
};

class CTest
{
public:
    CTest();
    ~CTest();

    int init();

private:
    ACE_Message_Queue<ACE_MT_SYNCH> m_queue;

    static void handleSend(void *p);
};


int main(int argc, char* argv[])
{
    CTest myTest;
    myTest.init();
    ACE_Thread_Manager::instance()->wait();
	return 0;
}

CTest::CTest()
{

}

CTest::~CTest()
{

}

int CTest::init()
{
    // 创建出来一个线程
    ACE_Thread_Manager::instance()->spawn((ACE_THR_FUNC)CTest::handleSend, (void*)this, 
        THR_NEW_LWP|THR_JOINABLE);

    Sleep(2000);
    int i = 0;
    for (; i < 20000; i++)
    {
        MYMSG *myMsg = new MYMSG;
        myMsg->version = 1;
        myMsg->sn = i;

        ACE_Message_Block *msgBlock = new ACE_Message_Block((const char *)myMsg, sizeof(MYMSG));

        m_queue.enqueue(msgBlock);
    }

    return 0;
}

void CTest::handleSend(void *p)
{
    if (NULL == p)
    {
        return;
    }
    CTest *my = (CTest *)p;

    ACE_Message_Queue<ACE_MT_SYNCH> *msgQueue = &my->m_queue;
    if (NULL == msgQueue)
    {
        return;
    }

    ACE_Time_Value timeout;
    while (true)
    {
        
        ACE_Message_Block * mb = NULL;
        msgQueue->dequeue(mb);
        if (NULL != mb)
        {
            MYMSG *myMsg = (MYMSG *)mb->base();
            delete mb;
            mb = NULL;

            std::cout << "sn = " << myMsg->sn << std::endl;
            delete myMsg;
            myMsg = NULL;
        }
    }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics