Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


E14-440 - CancelIo failed

Вы не вошли.

 Поиск | Регистрация | Вход 

Виталий
12.03.2012 12:56:06
#1

Гость

E14-440 - CancelIo failed

Добрый день!
Работаю с E14-440, по задаче периодически нужно останавливать сбор, соотв., проверяю,
if (!HasOverlappedIoCompleted(&ReadOv))
  rs = CancelIo(ReadEvent);

В некоторых случаях (закономерность пока не вижу) CancelIo возвращает false, при этом строка причины ошибки (через GetLastError и FormatMessage) - пустая, что в этом случае делать? Если продолжать работать, прога обрушивается.

12.03.2012 13:41:58
#2

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,535

Re: E14-440 - CancelIo failed

Вроде бы в описании CancelIo() сказано что необходимо использовать file HANDLE, а не event HANDLE:
http://msdn.microsoft.com/en-us/library … 85%29.aspx

Виталий
12.03.2012 14:38:30
#3

Гость

Re: E14-440 - CancelIo failed

Сергей, то есть, в нашем случае file HANDLE - это хэндл на модуль, получаемый функцией GetModuleHandle библиотеки? его в CancelIo передаем?

12.03.2012 14:48:43
#4

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,535

Re: E14-440 - CancelIo failed

Да.

12.03.2012 15:08:59
#5

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: E14-440 - CancelIo failed

Ну, во-первых, CancelIo(hModule), а не ReadEvent. Параметр CancelIo - дексриптор файла (устройства), т.е. то, что было первым параметров ReadFile/WriteFile. Отменяются при этом все асинхронные операции, запущенные для этого хендла в текущем потоке.

Во-вторых, мне кажется, что это неудачный способ работы с overlapped I/O.
Советую:
1) hModule->STOP_ADC()
2) CancelIo(hModule); безо всяких if. И код завершения CancelIo проверять особого смысла нет.
3) Обязательно после CancelIo() сделать для каждого начатого overlapped запроса GetOverlappedResult(hModule, &over, &num_bytes, TRUE), вот результат завершения этой функции есть смысл проверять (при останове по CancelIo GetOverlappedResult вернет 0 и GetLastError() == ERROR_OPERATION_ABORTED).

Например, если используется двойная буферизация - то одно CancelIo() и два GetOverlappedResult(..., TRUE) на каждый overlapped.

NB: Если не сделать GetOverlappedResult(..., TRUE) после CancelIo(), то могут быть неприятности в виде порчи памяти, занимаемой структурами OVERLAPPED, если, например, они в динамической памяти, которая сразу освобождается, или это локальные переменные, а функция завершается. Формально CancelIo() - это ЗАПРОС на остановку асинхронных операций, он выполняется также асинхронно, т.е. ядро ОС имеет право писать в *lpOverlapped до тех пор, пока GetOverlappedResult не вернет статус, что операция завершена успешно или с ошибкой.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4

Многоканальный телефон:+7 (495) 785-95-25

Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск