通过消息队列发送缓冲区
Sending buffer over message queue
我正在尝试通过 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]
中写入队列之前的值时,我可以看到它们是非零整数。但是,当我从队列中读取数组并检查其值时,它们为零。我不确定是什么导致了这个问题。我已经使用消息队列来发送单个值、字符串和结构,所以我想我可以按照相同的过程来发送数组,但情况似乎并非如此,除非我忽略了一些东西。
我的问题是,我可以通过消息队列发送 arrays/buffers 吗?如果可以,我是否正确设置了它?
注意:这是在 windows 嵌入式 compact 7 环境和 VS2008 中开发的。
提供的代码有几个问题。
1) 错误的参数值 - 您不需要获取数据缓冲区的地址,因为该变量已经是指向包含元素的内存开头的指针。所以将 (LPVOID)&data
更改为 (LPVOID)data
.
2) 大小错误 - sizeof
运算符将 return 4 因为那是指针的大小。在您的情况下,您需要传递 160 作为大小 (20 * sizeof(double)
).
至于可变大小写入 - 这会变得有点复杂,因为您需要知道在另一端读取多少数据。您可以做的是使用 first/first two/first 缓冲区的四个字节来包含大小,然后继续处理数据。然后你可以有一个函数接受可变长度的 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
然后读取尽可能多的数据,由读取值表示。
我正在尝试通过 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]
中写入队列之前的值时,我可以看到它们是非零整数。但是,当我从队列中读取数组并检查其值时,它们为零。我不确定是什么导致了这个问题。我已经使用消息队列来发送单个值、字符串和结构,所以我想我可以按照相同的过程来发送数组,但情况似乎并非如此,除非我忽略了一些东西。
我的问题是,我可以通过消息队列发送 arrays/buffers 吗?如果可以,我是否正确设置了它?
注意:这是在 windows 嵌入式 compact 7 环境和 VS2008 中开发的。
提供的代码有几个问题。
1) 错误的参数值 - 您不需要获取数据缓冲区的地址,因为该变量已经是指向包含元素的内存开头的指针。所以将 (LPVOID)&data
更改为 (LPVOID)data
.
2) 大小错误 - sizeof
运算符将 return 4 因为那是指针的大小。在您的情况下,您需要传递 160 作为大小 (20 * sizeof(double)
).
至于可变大小写入 - 这会变得有点复杂,因为您需要知道在另一端读取多少数据。您可以做的是使用 first/first two/first 缓冲区的四个字节来包含大小,然后继续处理数据。然后你可以有一个函数接受可变长度的 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
然后读取尽可能多的数据,由读取值表示。