I am passing an array through a message queue:
double data[20];
if(i!=20)
{
data[i] = getInstance()->real_time_data.f_ChannelData;
i++;
}
else
{
i = 0;
MsgQueueCommunicator::getInstance()->Write_Array_To_Queue(s_hMsgQueue_Communication, data);
}
Write_Array_To_Queue()
looks like this:
BOOL MsgQueueCommunicator::Write_Array_To_Queue(HANDLE hq,double data[20])
{
return WriteMsgQueue(hq,(LPVOID)data, 160,INFINITE,0);
}
Reading from the queue is pretty much the same as writing:
BOOL MsgQueueCommunicator::Read_Buffer_From_Queue(HANDLE hq,double data[20])
{
DWORD dwBytesRead;
DWORD dwFlags;
return ReadMsgQueue(hq, (LPVOID)data, 160, &dwBytesRead, INFINITE, &dwFlags);
}
To initialize the queue on both ends, I use the following function:
HANDLE MsgQueueCommunicator::InitMessageQueue(bool IsRead,wchar16_t* wQueueName)
{
MSGQUEUEOPTIONS msgopts;
msgopts.dwSize = sizeof(MSGQUEUEOPTIONS);
msgopts.dwFlags = MSGQUEUE_ALLOW_BROKEN;//0;
msgopts.dwMaxMessages = 0;
msgopts.cbMaxMessage = 160;
msgopts.bReadAccess = IsRead;
HANDLE hq = CreateMsgQueue(wQueueName, &msgopts);
return hq;
}
The issue i am getting is that the last 3 values of the array will occasionally be 0. I checked by printing the values in the array before and after writing to the queue and noticed the discrepancy. I am not sure where the issue is. I've tried changing the number of bytes for the destination buffer, i printed out the number of bytes read to make sure it was correct, and I have not yet been able to find the root cause.
Here is a snippet of what i see when i print out the values:
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088488 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088490 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088490 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088490 PID:7bb0046 TID:6a50052 Channel Data (USB): 0
6088490 PID:7bb0046 TID:6a50052 Channel Data (USB): 0
6088492 PID:7bb0046 TID:6a50052 Channel Data (USB): 0
6088528 PID:7bb0046 TID:6a50052 Bytes Read: 160
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088528 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088530 PID:7bb0046 TID:6a50052 Channel Data (USB): 0
6088530 PID:7bb0046 TID:6a50052 Channel Data (USB): 0
6088530 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Bytes Read: 160
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088568 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088569 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088569 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088570 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088570 PID:7bb0046 TID:6a50052 Channel Data (USB): 0
6088570 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
6088570 PID:7bb0046 TID:6a50052 Channel Data (USB): 1100
The 0's are not intended, but the 1100's are. Im not sure what I am doing wrong (if any), but is it possible to send arrays over message queues without possible memory issues?
Notes: This is being developed for Platform Builder (WEC7) and VS2008.
That looks like a timing problem in inter-process communication. A read succeeds but with fewer characters than were sent, because of the relative timing.
You need to check for a short read and retry to complete the desired amount.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.