我的设计是这样的,一个服务端,多个客户端,当客户端发送报文时,服务端接收报文,并放入消息队列,然后断开,由另一个进程读这个消息队列,并作相应处理,我想问的是如何共享这个消息队列,用共享内存的方法好像不太好实现啊,在线等待...
解决方案 »
- 惨啊,,,惨啊,,,求救!!有关resource.h
- CAnsyncSocket与WSAAnsyncSelect有什么区别??
- 我写了一个软件采用的直接连接远程服务器(sqlserver)客户端直接连接需要装什么吗?现在我都没有安装,客户端连接不上远程服务器
- 请问哪里有用VC++开发Windows Media Player的实例代码?MSDN的不完整。谢谢!!
- 我已经走头无路了!!!帮帮我啊!!!我已经走头无路了!!!帮帮我啊!!!我已经走头无路了!!!帮帮我啊!!!我已经走头无路了!!
- 局域网内部如何调用别人机子的数据库??
- 把*.dat文件分成多个mp3文件?请帮助!
- int func _((long l, int code));'_'什么意思??
- 如何把HICON转换为HBITMAP,如何把HICON存储为一个.ico文件?
- 高分求非基于对话框模式的自绘组合框的代码
- 在线紧急求助:怎样实现一个Doc关联多个View呢?急急急呀~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- DirectShow Filter: 我的视频窗口为何要移动窗口时才刷新?
class Type,
class Container = deque<Type>
>
class queue 你可以把你接收到的message包加入一个share queue中这是你需要对queue实行加锁 ,只读。待操作完成解锁,保证对queue的安全使用。
所说得正是我想做得,我问得就是如何实现这个共享消息队列
是不是用共享内存得方法啊进程一写消息队列,然后把队列头指针放在共享内存里,进程二读共享内存,取得头指针,然后根据头指针允许访问队列里得元素或内存吗(因为不是同一个进程内)?这种方式可行吗,不行的话,有什么别的方法啊
为什么不直接使用服务端程序处理?
不明白为什么这样设计??????
什么目的???写文件是一个不错的方法,而不是放到队列中。因为终端太多,直接处理系统开销太大。
所以想用UNIX下那种消息队列方式处理
我现在只能实现将队列中的一个消息放入共享内存,而其他的队列元素无法访问啊
//生产者:
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;
}