gpt4 book ai didi

c++ - 通过消息队列发送缓冲区

转载 作者:行者123 更新时间:2023-11-28 06:07:36 26 4
gpt4 key购买 nike

我正在尝试通过 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 是一维 double 组。

为了从队列中读取,我调用了以下函数:

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 又是一维 double 组。

现在,当我在写入队列之前检查放入 usb_data[20] 的值时,我可以看到它们是非零整数。但是,当我从队列中读取数组并检查其值时,它们为零。我不确定是什么导致了这个问题。我已经使用消息队列来发送单个值、字符串和结构,所以我想我可以按照相同的过程来发送数组,但情况似乎并非如此,除非我忽略了一些东西。

我的问题是,我可以通过消息队列发送数组/缓冲区吗?如果可以,我是否正确设置了它?

注意:这是在 windows embedded 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,然后读取读取值所表示的尽可能多的数据。

关于c++ - 通过消息队列发送缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32076732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com