Я пытаюсь отправить (в идеале) 2-й буфер из одного процесса в другой, по 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
это снова 1d двойной массив.
Теперь, когда я проверяю значения, которые помещаются в usb_data[20]
, прежде чем он будет записан в очередь, я вижу, что они являются ненулевыми целыми числами. Однако, когда я читаю массив из очереди и проверяю его значения, они равны нулю. Я не уверен, что вызывает эту проблему. Я использовал очереди сообщений для отправки одиночных значений, строк и структур, поэтому я решил, что смогу выполнить ту же процедуру для отправки по массиву, но это, похоже, не так, если только я не замечаю что-то.
Вопрос в том, могу ли я отправлять массивы/буферы в очередь сообщений, и если да, то я правильно настроил его?
Примечание: Это разрабатывается в среде с встроенным компактным интерфейсом 7 и VS2008.
Возвращает ли dwBytesRead ожидаемое значение (20, я предполагаю?). Я подозрительно отношусь к sizeof (data) в ReadMsgQueue, так как он может возвращать размер указателя, который равен 4 вместо 20, но я не уверен. – walkingTarget
Нужно ли '(LPVOID) и данные? Разве данные '(LPVOID)' достаточно, поскольку он уже является указателем на начало блока памяти с удвоением? –
Я согласен с @ Rudolfs Bundulis. Я думаю, что если вы объедините наши два комментария, вы увидите успех. – walkingTarget