2010-10-16 3 views
1

Существует множество причин для вызова CancelIo, но в моем конкретном случае я вызываю его, чтобы знать, что система больше не записывает в буфер. Как только я это знаю, я могу безопасно освободить буфер.Что делать, если CancelIo не удается?

Но что делать, если CancelIo не удается? То, что я делаю сейчас, явно вытесняет буфер и генерирует исключение. Есть ли лучшие способы справиться с этим?

P.S. Аналогичные призывы к Европе, Ганимеду и Каллисто, похоже, отсутствуют. Должен ли я записывать ошибку?

ответ

0

Я не думаю, что есть ответ здесь больше удовлетворения, чем тот, который я уже нашел:.

течи буфер (и бросить исключение (или сделать эквивалент для среды)).

0

Документы MSDN не совсем понятны, какие ошибки могут быть возвращены. Я предполагаю, что (так как CancelIo является асинхронным), это означает, что вы использовали плохой дескриптор или что-то в этом роде. По асинхронному я имею в виду, что только потому, что CancelIo возвращает OK, вы не можете сразу освободить буфер для любого ожидающего ввода-вывода.

: В документах указано, что ожидающие ввода-вывода будут возвращены ERROR_OPERATION_ABORTED. Я думаю, вы уже отслеживаете ожидающее состояние ввода-вывода, чтобы вы могли безопасно освободить буфер, если и только если все ожидающие ввода-вывода возвращают эту ошибку. Если ожидающий ввода-вывода остается висящим после CancelIo, освобождение буфера может вызвать каскад нежелательных побочных эффектов.

+0

Точно. Вот почему я (в настоящее время) утечка буфера. –

+0

Если вы не можете учитывать ожидающие IO, я не вижу выбора. –

0

Нельзя сразу удалять буферы после выдачи запроса на отмену.

Взятые из документации CancelIoEx:

Если есть какие-либо отложенные операции ввода/вывода в ходе для указанного дескриптора файла, функция CancelIoEx отмечает их для отмены. Большинство типов операций могут быть немедленно отменены; другие операции могут продолжаться до завершения, прежде чем они будут фактически отменены, и вызывающий абонент будет уведомлен. Функция CancelIoEx не ждет завершения всех отмененных операций.

Так что CancelIo не «освобождает» операцию io, но отмечает ее только как «отмененную». Вы должны ждать результата ваших асинхронного-чтение/запись до конца (либо успешно или с ERROR_OPERATION_ABORTED

+0

Не беспокойтесь. Я жду на соответствующем событии перед освобождением буфера. –

+0

Обратите внимание, что это ограничение применяется к 'CancelIoEx', с которым вам все равно нужно называть' GetOverlappedResult'.'CancelIO', похоже, отменяет синхронно (возможно, так как он вызван в поток выдачи) – peterchen

0

Мой ответ может быть не связана с вопросом. но может быть помощь ..

в асинхронном IO..CancelIoEx отменить ожидающий ввода-вывода Если ожидающий IO возвращает 1 и генерирует сообщение завершения или call com код pletion. Если нет ожидающего ввода-вывода, он возвращает 0 с кодом ошибки 1168..no и кодом завершения вызова. Но на самом деле. там может прибыть планируемый IO сразу после вызова cancelioex. Это все корень зла. Я думал, отменил все IO. но все еще остается IO ..

Смежные вопросы