Значения массива изменены на 0

Я передаю массив через очередь сообщений:

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() выглядит так:

BOOL MsgQueueCommunicator::Write_Array_To_Queue(HANDLE hq,double data[20])
{
return WriteMsgQueue(hq,(LPVOID)data, 160,INFINITE,0);
}

Чтение из очереди — это почти то же самое, что и запись:

BOOL MsgQueueCommunicator::Read_Buffer_From_Queue(HANDLE hq,double data[20])
{
DWORD dwBytesRead;
DWORD dwFlags;
return ReadMsgQueue(hq, (LPVOID)data, 160, &dwBytesRead, INFINITE, &dwFlags);
}

Чтобы инициализировать очередь на обоих концах, я использую следующую функцию:

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;
}

Проблема, которую я получаю, состоит в том, что последние 3 значения массива иногда будут равны 0. Я проверил, печатая значения в массиве до и после записи в очередь, и заметил несоответствие. Я не уверен, где проблема. Я попытался изменить количество байтов для целевого буфера, я распечатал количество прочитанных байтов, чтобы убедиться, что он был правильным, и я пока не смог найти основную причину.

Вот фрагмент того, что я вижу, когда распечатываю значения:

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

0 не предназначены, но 1100. Я не уверен, что я делаю неправильно (если есть), но возможно ли посылать массивы через очереди сообщений без возможных проблем с памятью?

Примечания: Это разрабатывается для Platform Builder (WEC7) и VS2008.

-3

Решение

Это похоже на проблему синхронизации в межпроцессном взаимодействии. Чтение успешно, но с меньшим количеством символов, чем было отправлено, из-за относительного времени.
Вам нужно проверить на короткое чтение и повторить попытку, чтобы завершить желаемое количество.

0

Другие решения


По вопросам рекламы [email protected]