在消息队列上发送缓冲区

Sending buffer over message queue

本文关键字:缓冲区 消息 队列      更新时间:2023-10-16

我正试图通过消息队列从一个进程发送(理想情况下)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,然后读取读取值表示的尽可能多的数据。