我試圖發送(理想情況下)從一個進程到另一個2d緩衝區,通過Message Queue,但我試圖首先使用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
哪裏再次是一維陣列雙。
現在,當我檢查在寫入隊列之前放入usb_data[20]
的值時,我可以看到它們是非零整數。但是,當我從隊列中讀取數組並檢查其值時,它們爲零。林不知道是什麼原因造成這個問題。我使用消息隊列發送單個值,字符串和結構,所以我想我可以按照相同的過程發送數組,但這似乎並不是這樣,除非我忽略了某些東西。
我的問題是,我可以通過消息隊列發送數組/緩衝區,如果是,我可以正確設置它嗎?
注:這是在Windows嵌入式緊湊型7環境和VS2008中開發的。
dwBytesRead是否返回期望值(20,我猜?)。我懷疑ReadMsgQueue中的sizeof(data),因爲它可能會返回指針的大小,即4而不是20,但我不確定。 – walkingTarget
是否需要'(LPVOID)&data'?是不是'(LPVOID)數據',因爲它已經是一個指向內存塊的開始與雙打? –
我同意@Rudolfs Bundulis。我想如果你結合我們的兩個評論,你會看到成功。 – walkingTarget