Использование перекрывающихся конфликтов ввода-вывода с C++ D'tor

Я пишу сервер для одного клиента (на данный момент), который имеет основной цикл, который обрабатывает клиентский запрос и отправляет соответствующий обработчик.

для некоторых целей я хотел бы использовать перекрывающийся ввод-вывод MS (это только для окон) . в одном из них я хочу прочитать из файла и записать содержимое в сокет. поскольку у меня есть класс Wrap для этого действия, он выделяет буфер, размер файла, а затем выполняется вызов ReadFile (с реальным файлом файловой системы), за которым следует WriteFile (на этот раз, дескриптору сокета) .) оба пчелы перекрываются.

проблема в том, что поскольку он асинхронный, класс d'tor вызывается автоматически, и буфер файла освобождается до того, как работа будет выполнена,

очевидно, это мой сломанный дизайн, мне очень хотелось бы услышать ваше предложение,

Спасибо!

4 ответа

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

Вы можете использовать мьютекс внутри асинхронных функций и внутри деструкторов.

Может создать поток, который работает в фоновом режиме, чтобы проверить, что ввод-вывод файла все еще необходимо выполнить, и оставить класс файла открытым (даже если это просто цикл для продолжения ожидания). Таким образом, сокет может делать то, что ему нужно, и IO может непрерывно (через флаг, установленный в переменной-члене класса) держать его в курсе своего статуса.

Затем в деструкторе проверьте, разблокирован ли он и готов ли, в противном случае - еще один цикл остановки.

Спасибо всем,

Похоже, я что-то упустил, поскольку использование другого потока для проверки или просто ожидание завершения, похоже, утрачено из-за преимуществ асинхронного ввода-вывода.

Я предполагаю, что я ищу метод использования, который MS планировал использовать разработчиками.

Другие вопросы по тегам