Допустим ли параметр lpNumberOfBytesTransfer в GetOverlappedResult, когда GetLastError возвращает ERROR_OPERATION_ABORTED?

В моем проекте мне нужно читать и писать в последовательный порт (RS232). Я использую перекрывающийся ввод-вывод и использую два отдельных потока для чтения и записи.

Когда я запускаю операцию записи, которая не завершается немедленно, я начинаю ждать (WaitForMultipleObjects) двух событий; событие, назначенное члену hEvent перекрывающейся структуры, и событие остановки. Когда я хочу остановить поток, я сигнализирую о событии остановки, вызывая SetEvent (). Это приводит к возврату функции ожидания. Поскольку операция записи все еще не завершена, я отменяю операцию, вызывая CancelIO (). Опять же, я жду завершения операции, теперь использую GetOverlappedResult () с параметром bWait, установленным на True. Когда операция завершается, GetOverlappedResult () возвращает False, а GetLastError () возвращает ERROR_OPERATION_ABORTED.

А теперь вопрос:

Когда GetOverlappedResult () возвращает False, а GetLastError () возвращает ERROR_OPERATION_ABORTED (указывает на завершенную, но отмененную операцию), действителен ли параметр lpNumberOfBytesTransfer? Другими словами, дает ли lpNumberOfBytesTransfer фактическое количество записанных байтов до его отмены? Или в этом случае параметр lpNumberOfBytesTransfer не определен?


person R. Beiboer    schedule 22.10.2013    source источник
comment
Поскольку вы уже используете потоки, почему вы решили использовать асинхронный ввод-вывод? Асинхронный ввод-вывод намного сложнее, чем блокирование ввода-вывода, и, поскольку вы счастливы переносить код в потоки, конечно же, проще использовать блокирующий ввод-вывод? Или мне не хватает причины, по которой вы выбрали aysnc?   -  person David Heffernan    schedule 22.10.2013
comment
Используя перекрывающийся ввод-вывод в отдельных потоках, я могу выполнять операции ReadFile и WaitCommEvent в одном потоке, а операции WriteFile - в другом. И поскольку они перекрываются, я могу позволить потоку ждать завершения операций и события остановки, что позволяет мне отменить операции. Отменить блокировку ввода-вывода намного сложнее.   -  person R. Beiboer    schedule 22.10.2013
comment
Это деталь реализации драйвера. Существует множество возможных драйверов последовательного порта, они часто эмулируются драйвером устройства USB или BlueTooth. Часто сомнительного качества. Стандартный драйвер Microsoft уже говорит «нет», он устанавливает для поля IRP.IOStatus.Information значение 0 при отмене IRP. Не отменяйте ввод-вывод, если вы не можете позволить себе потерю данных.   -  person Hans Passant    schedule 22.10.2013
comment
Спасибо @HansPassant. Я бы хотел принять ваш комментарий как ответ, но с комментариями это невозможно.   -  person R. Beiboer    schedule 23.10.2013
comment
Я уже опубликовал ответ, но он был быстро отклонен. Понятия не имею, почему, трудно узнать что-то новое, когда противники не делятся своими знаниями. Афаик, мой комментарий точен. Не стесняйтесь просто скопировать его в свой пост и отметить как ответ.   -  person Hans Passant    schedule 23.10.2013


Ответы (1)


Я повторю комментарий Ханса Пассанта, потому что считаю, что он дает точный ответ на мой вопрос:

Это деталь реализации драйвера. Существует множество возможных драйверов последовательного порта, они часто эмулируются драйвером устройства USB или BlueTooth. Часто сомнительного качества. Стандартный драйвер Microsoft уже говорит «нет», он устанавливает для поля IRP.IOStatus.Information значение 0 при отмене IRP. Не отменяйте ввод-вывод, если вы не можете позволить себе потерю данных.

person R. Beiboer    schedule 23.10.2013