Как реализовать асинхронную запись в c / c ++? - PullRequest
1 голос
/ 08 сентября 2010
WriteFile( tmp_pipe, &Time, sizeof(double), &dwWritten, NULL );

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

Как сделать вышеизложенное мгновенно, возможно, просто игнорировать данные, если буферполный

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Определенным способом является использование boost::asio.

Асинхронный ввод-вывод очень трудно сделать правильным и переносимым, если вы не используете хорошую библиотеку.

0 голосов
/ 08 сентября 2010

Если вам не нужен переносимый код, тогда лучше использовать Win32 напрямую.

Если вы укажете адрес структуры OVERLAPPED в качестве окончательного параметра, то позже вы получите информацию об асинхронной записи через эту структуру OVERLAPPED.Вам нужно открыть файл в режиме перекрытия.Кроме того, вы можете использовать WriteFileEx и предоставить обратный вызов завершения.Прочитайте MSDN документы для получения более подробной информации.

Обратите внимание, что вам все равно придется разумно разобраться со случаем, когда у вас есть I / O выдающийся на конвейере.Невозможно просто делать записи «запусти и забудь», игнорируя тот факт, что канал имеет ограниченную пропускную способность.В конце концов вы достигнете некоторого лимита пула буферов ядра и произойдет сбой ввода-вывода, возможно, сломая ваш канал до тех пор, пока он не будет перезапущен.

Это трудно понять, но есть много примеров в сети, чтобы помочь.Для дополнительной поддержки используйте порты завершения ввода-вывода, которые обеспечивают наивысшую производительность для асинхронного ввода-вывода в пользовательском режиме Windows.Не уверен на 100%, что это относится к каналам, но, конечно, к сокетам и файлам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...