我的设计是这样的,一个服务端,多个客户端,当客户端发送报文时,服务端接收报文,并放入消息队列,然后断开,由另一个进程读这个消息队列,并作相应处理,我想问的是如何共享这个消息队列,用共享内存的方法好像不太好实现啊,在线等待...

解决方案 »

  1.   

    关键不在于你的实现方法,而在于你的程序的架构,如果没有好的程序架构,在简单的程序都不可能写好,如果你设计的架构健壮,易于扩展,那么程序的稳定性就非常高。你可以使用shared queue ,但是需要你对共享resource的控制非常好,不会产生竞争现象。资源的同步非常重要 。
      

  2.   

    template <
       class Type, 
       class Container = deque<Type> 
    >
    class queue 你可以把你接收到的message包加入一个share queue中这是你需要对queue实行加锁 ,只读。待操作完成解锁,保证对queue的安全使用。
      

  3.   

    mixtrue(忽报人间曾伏虎,泪飞顿作倾盆雨。) 
    所说得正是我想做得,我问得就是如何实现这个共享消息队列
    是不是用共享内存得方法啊进程一写消息队列,然后把队列头指针放在共享内存里,进程二读共享内存,取得头指针,然后根据头指针允许访问队列里得元素或内存吗(因为不是同一个进程内)?这种方式可行吗,不行的话,有什么别的方法啊
      

  4.   

    为什么还要使用另外的进程读取队列中的消息啊?
    为什么不直接使用服务端程序处理?
    不明白为什么这样设计??????
    什么目的???写文件是一个不错的方法,而不是放到队列中。因为终端太多,直接处理系统开销太大。
    所以想用UNIX下那种消息队列方式处理
      

  5.   

    但不知在Windows下如何实现,
    我现在只能实现将队列中的一个消息放入共享内存,而其他的队列元素无法访问啊
      

  6.   

    标准的生产者消费者问题:
    //生产者:
    int CBuffer::Write(CAccessorMsgToSend &item)
    {
    //等待到有剩余单元, 或停止信号
    HANDLE sh[2];
    sh[0] = m_hEvent;
    sh[1] = m_shSem[0];
    if (WaitForMultipleObjects(2, sh, FALSE, INFINITE) - WAIT_OBJECT_0 != 1)
    return -1; //进入操作
    EnterCriticalSection(&m_cs); //m_pItem[m_dwIn].nId = item;
    CopyMemory(&m_pItem[m_dwIn], &item, sizeof(CAccessorMsgToSend));
    m_dwIn = (m_dwIn + 1) % m_dwSize; //退出操作
    LeaveCriticalSection(&m_cs);
    //增加有数据单元
    ReleaseSemaphore(m_shSem[1], 1, NULL); return 0;
    }//消费者:
    int CBuffer::Read(CAccessorMsgToSend &item)
    {
    //等待到有数据单元
    HANDLE sh[2];
    sh[0] = m_hEvent;
    sh[1] = m_shSem[1];
    if (WaitForMultipleObjects(2, sh, FALSE, INFINITE) - WAIT_OBJECT_0 != 1)
    return -1; //进入操作
    EnterCriticalSection(&m_cs); CopyMemory(&item, &m_pItem[m_dwOut], sizeof(CAccessorMsgToSend));
    m_dwOut = (m_dwOut + 1) % m_dwSize; //退出操作
    LeaveCriticalSection(&m_cs);
    //增加剩余单元
    ReleaseSemaphore(m_shSem[0], 1, NULL); return 0;
    }