Использование перекрывающихся конфликтов ввода-вывода с C++ D'tor
Я пишу сервер для одного клиента (на данный момент), который имеет основной цикл, который обрабатывает клиентский запрос и отправляет соответствующий обработчик.
для некоторых целей я хотел бы использовать перекрывающийся ввод-вывод MS (это только для окон) . в одном из них я хочу прочитать из файла и записать содержимое в сокет. поскольку у меня есть класс Wrap для этого действия, он выделяет буфер, размер файла, а затем выполняется вызов ReadFile (с реальным файлом файловой системы), за которым следует WriteFile (на этот раз, дескриптору сокета) .) оба пчелы перекрываются.
проблема в том, что поскольку он асинхронный, класс d'tor вызывается автоматически, и буфер файла освобождается до того, как работа будет выполнена,
очевидно, это мой сломанный дизайн, мне очень хотелось бы услышать ваше предложение,
Спасибо!
4 ответа
Глядя на документы, кажется, что вы хотите позвонить GetOverlappedResult
с bWait
быть установленным Это будет блокировать до завершения операции перекрытия.
Вы можете использовать мьютекс внутри асинхронных функций и внутри деструкторов.
Может создать поток, который работает в фоновом режиме, чтобы проверить, что ввод-вывод файла все еще необходимо выполнить, и оставить класс файла открытым (даже если это просто цикл для продолжения ожидания). Таким образом, сокет может делать то, что ему нужно, и IO может непрерывно (через флаг, установленный в переменной-члене класса) держать его в курсе своего статуса.
Затем в деструкторе проверьте, разблокирован ли он и готов ли, в противном случае - еще один цикл остановки.
Спасибо всем,
Похоже, я что-то упустил, поскольку использование другого потока для проверки или просто ожидание завершения, похоже, утрачено из-за преимуществ асинхронного ввода-вывода.
Я предполагаю, что я ищу метод использования, который MS планировал использовать разработчиками.