在消息队列上发送缓冲区
Sending buffer over message queue
我正试图通过消息队列从一个进程发送(理想情况下)2d缓冲区到另一个进程,但我试图首先使用1d缓冲区。
初始化队列的函数如下:
HANDLE MsgQueueCommunicator::InitMessageQueue_data(bool IsRead,wchar16_t* wQueueName)
{
MSGQUEUEOPTIONS msgopts;
msgopts.dwSize = sizeof(MSGQUEUEOPTIONS);
msgopts.dwFlags = MSGQUEUE_ALLOW_BROKEN;//0;
msgopts.dwMaxMessages = 0;
msgopts.cbMaxMessage = sizeof(data[20]);
msgopts.bReadAccess = IsRead;
HANDLE hq = CreateMsgQueue(wQueueName, &msgopts);
if ( hq == NULL )
{
return NULL;
}
return hq;
}
进程1的队列初始化:
HANDLE hMsgQueueR = MsgQueueCommunicator::getInstance()->InitMessageQueue_data(true, L"CommDataStreaming");
进程2中的队列初始化:
HANDLE s_hMsgQueue_Communication = MsgQueueCommunicator::getInstance()->InitMessageQueue_data(false,L"CommDataStreaming");
要写入队列,我调用以下函数:
BOOL MsgQueueCommunicator::Write_Array_To_Queue(HANDLE hq,double data[20])
{
return WriteMsgQueue(hq,(LPVOID)&data, sizeof(data),INFINITE,0);
}
MsgQueueCommunicator::getInstance()->Write_Array_To_Queue(s_hMsgQueue_Communication, usb_data);
其中usb_data
为一维双数组。
要从队列中读取,我调用以下函数:
BOOL MsgQueueCommunicator::Read_Array_From_Msg_Queue(HANDLE hq,double data[20])
{
DWORD dwBytesRead;
DWORD dwFlags;
return ReadMsgQueue(hq, (LPVOID)&data, sizeof(data), &dwBytesRead, INFINITE, &dwFlags);
}
MsgQueueCommunicator::getInstance()->Read_Array_From_Msg_Queue(hMsgQueueR, usb_data);
其中usb_data
也是一维双数组
现在,当我检查在写入队列之前放入usb_data[20]
的值时,我可以看到它们是非零整数。然而,当我从队列中读取数组并检查其值时,它们是零。我不确定是什么导致了这个问题。我已经使用消息队列来发送单个值,字符串和结构体,所以我想我将能够遵循相同的过程来发送数组,但这似乎并非如此,除非我忽略了一些东西。
我的问题是,我可以发送数组/缓冲区的消息队列,如果是,我设置它正确吗?
注意:这是在windows嵌入式compact 7环境和VS2008中开发的。
提供的代码有几个问题。
1)参数值错误——你不需要获取数据缓冲区的地址,因为变量已经是指向包含元素的内存开始的指针。因此将(LPVOID)&data
改为(LPVOID)data
。
2)错误的大小- sizeof
操作符将返回4,因为这是指针的大小。在你的情况下,你需要传递160作为大小(20 * sizeof(double)
)。
对于可变大小的写操作—这有点复杂,因为您需要知道在另一端要读取多少数据。你能做的是使用,比如说,第一个/前两个/前四个字节的缓冲区来包含大小,然后继续处理数据。然后,您可以有一个接受可变长度的double
数组并写入它的函数。例如:
BOOL Write_Array_To_Queue(HANDLE hq,double data[], unsigned int count)
{
size_t buffer_size = sizeof(count) + count * sizeof(double);
BYTE* buffer = new BYTE[buffer_size];
memcpy(buffer, &count, sizeof(count));
memcpy(buffer + sizeof(count), &data, sizeof(double) * count);
return WriteMsgQueue(hq,(LPVOID)buffer, buffer_size,INFINITE,0);
}
或
BOOL Write_Array_To_Queue(HANDLE hq,double data[], unsigned int count)
{
return WriteMsgQueue(hq,(LPVOID)&count, sizeof(count),INFINITE,0) && WriteMsgQueue(hq,(LPVOID)data, sizeof(double) * count,INFINITE,0);
}
,然后在接收端,您将首先读出unsigned int
,然后读取读取值表示的尽可能多的数据。
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 协议缓冲区ParseFromString不检查消息结尾
- 应该如何读取堆缓冲区溢出错误消息?
- TCP 缓冲区中的多条消息
- 协议缓冲区#3将消息从c ++发送到c#
- 将二进制数据缓冲区存储在协议缓冲区消息中
- 如何将消息发送到缓冲区并反向打印前三个单词的消息
- Android如何确定logcat消息使用哪个缓冲区
- 如何将多个协议缓冲区的消息写入可附加的压缩文件中?
- C++中的Google协议缓冲区:从现有结构中创建消息
- 协议缓冲区-读取所有消息中通用的标头(嵌套消息)
- 解析来自固定大小字节缓冲区的连续块的protobuf消息序列
- 在调试模式下销毁协议缓冲区消息几乎比在发布模式下慢 500 倍
- 如何在套接字编程中发送长度大于缓冲区的消息
- ZeroMQ 在节点之间创建消息缓冲区
- 在 c++ 中使用消息结构读取/填充数据缓冲区的正确方法是什么?
- 在外部消息中包括预编码的协议缓冲区消息
- winsock,面向消息的网络,以及从recv中类型转换缓冲区
- 如何在协议缓冲区中设置嵌套消息的字段
- 是否可以使用 Varint32 大小前缀的协议缓冲区消息实现类似"FileInputStream::BackUp()"的功能?