通过消息队列发送缓冲区

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然后读取尽可能多的数据,由读取值表示。