Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
Тема закрыта
|
||||
|
|
E14-440 - CancelIo failedДобрый день!
В некоторых случаях (закономерность пока не вижу) CancelIo возвращает false, при этом строка причины ошибки (через GetLastError и FormatMessage) - пустая, что в этом случае делать? Если продолжать работать, прога обрушивается. |
|||
|
||||
|
|
Re: E14-440 - CancelIo failedВроде бы в описании CancelIo() сказано что необходимо использовать file HANDLE, а не event HANDLE:
|
|||
|
||||
|
|
Re: E14-440 - CancelIo failedСергей, то есть, в нашем случае file HANDLE - это хэндл на модуль, получаемый функцией GetModuleHandle библиотеки? его в CancelIo передаем? |
|||
|
||||
|
|
Re: E14-440 - CancelIo failedДа. |
|||
|
||||
|
|
Re: E14-440 - CancelIo failedНу, во-первых, CancelIo(hModule), а не ReadEvent. Параметр CancelIo - дексриптор файла (устройства), т.е. то, что было первым параметров ReadFile/WriteFile. Отменяются при этом все асинхронные операции, запущенные для этого хендла в текущем потоке. Во-вторых, мне кажется, что это неудачный способ работы с overlapped I/O.
Например, если используется двойная буферизация - то одно CancelIo() и два GetOverlappedResult(..., TRUE) на каждый overlapped. NB: Если не сделать GetOverlappedResult(..., TRUE) после CancelIo(), то могут быть неприятности в виде порчи памяти, занимаемой структурами OVERLAPPED, если, например, они в динамической памяти, которая сразу освобождается, или это локальные переменные, а функция завершается. Формально CancelIo() - это ЗАПРОС на остановку асинхронных операций, он выполняется также асинхронно, т.е. ядро ОС имеет право писать в *lpOverlapped до тех пор, пока GetOverlappedResult не вернет статус, что операция завершена успешно или с ошибкой. |
|||
Страницы 1
Тема закрыта
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4
Многоканальный телефон:+7 (495) 785-95-25
Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск