在消息队列

时间:2015-08-18 15:35:02

标签: c++ ipc message-queue windows-embedded-compact

我试图通过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中开发的。

1 个答案:

答案 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,然后读取尽可能多的数据,如读取值所示。