我试图通过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
是1d双数组。
要从队列中读取,我调用以下函数:
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
再次是1d双数组。
现在,当我检查在usb_data[20]
写入队列之前放入的值时,我可以看到它们是非零整数。但是,当我从队列中读取数组并检查其值时,它们为零。我不确定是什么导致了这个问题。我已经使用消息队列来发送单个值,字符串和结构,所以我想我可以按照相同的过程发送一个数组,但这似乎并非如此,除非我忽略了一些东西。
我的问题是,我可以通过消息队列发送数组/缓冲区吗?如果是,我可以正确设置它吗?
注意:这是在Windows嵌入式压缩7环境和VS2008中开发的。
答案 0 :(得分:1)
提供的代码存在一些问题。
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
,然后读取尽可能多的数据,如读取值所示。