Помощь с асинхронным вводом / выводом

1
задан kiamlaluno 11 July 2010 в 00:48
поделиться

2 ответа

Это похоже на синхронный код. При асинхронном (OVERLAPPED) вводе/выводе вы не можете использовать буфер до завершения операции. Установите член hEvent структуры OVERLAPPED и измените свой главный цикл с PeekMessage на MsgWaitForMultipleObjects, чтобы ваша программа могла реагировать на события ввода/вывода. Затем вы можете ждать как хэндл операции OVERLAPPED, так и хэндл процесса, чтобы знать, когда другая программа вышла.

2
ответ дан 2 September 2019 в 23:08
поделиться

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

Вы создаете файл с отображением памяти следующим образом:

SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = TRUE;
sa.nLength = sizeof( sa );
sa.lpSecurityDescriptor = NULL;

hdFile = CreateFileMapping(INVALID_HANDLE_VALUE,&sa,
   PAGE_READWRITE,0,dwBufSize, L"SomeName");

Затем вы получаете указатель на разделяемую память, как этот

pOutSharedMemory=MapViewOfFile(hdFile,FILE_MAP_ALL_ACCESS,0,0,dwBufSize);

, теперь вы можете отображать указатели на память

, например. пара счетчиков, чтобы отслеживать, где вы находитесь в памяти (в пределах dwBufSize)

pdwReadOffset = reinterpret_cast<DWORD*>(pOutSharedMemory)
pdwWriteOffset = pdwReadOffset + sizeof(DWORD)

, тогда есть некоторая структура, которую вы затем читаете / записываете в память с помощью memmove

, вам нужно будет позаботиться о синхронизации на месте, используя критические разделы и т. д.

0
ответ дан 2 September 2019 в 23:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: