2015-08-18 4 views
0

Я пытаюсь отправить (в идеале) 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.

+0

Возвращает ли dwBytesRead ожидаемое значение (20, я предполагаю?). Я подозрительно отношусь к sizeof (data) в ReadMsgQueue, так как он может возвращать размер указателя, который равен 4 вместо 20, но я не уверен. – walkingTarget

+1

Нужно ли '(LPVOID) и данные? Разве данные '(LPVOID)' достаточно, поскольку он уже является указателем на начало блока памяти с удвоением? –

+0

Я согласен с @ Rudolfs Bundulis. Я думаю, что если вы объедините наши два комментария, вы увидите успех. – walkingTarget

ответ

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, а затем прочитать как можно больше данных, как обозначено считанного значения.

+0

Единственная проблема, с которой я сталкиваюсь сейчас, - это время, когда я буду читать 0 в конце буфера, но я написал ненулевые значения в буфер. Это будет между 1-3 0. Не знаю, почему это происходит. – Javia1492

+0

@ Javia1492 Может быть, есть проблемы с размером? Возможно ли, что размер записи больше размера данных и просто скопируйте некоторую неинициализированную память? На самом деле отсутствует часть письменных данных? –

+0

Если я буфера 20 значений, 1-20 и прочитал буфер после его записи, может возникнуть сценарий, в котором я получаю «1,2,3,4, ..., 16,17,0,0,0 '. Размер буфера данных равен 20, а размер буфера для msgqueue чтения/записи равен 160. 'return WriteMsgQueue (hq, (LPVOID) data, 160, INFINITE, 0);' Я не знаю, где он может копировать неинициализированные потому что я запускаю все на индексных переменных цикла и убедился, что они не превышают количество образцов, которые я читаю/пишу – Javia1492

Смежные вопросы