Я обрабатываю нестандартный модем через последовательный порт с перекрытием. Помимо чтения и записи на телекоммуникационную линию, я должен проверить контрольные линии, как CTS и DSR с использованием функции WaitCommEvent()
.Отмена WaitCommEvent для перекрывающихся серийных операций ввода-вывода
DWORD EvtMask;
/// (some scopes/levels ommitted)
const BOOL syncChange = WaitComEvent(hFile, &EvtMask, &overlapped);
if (!syncChange) {
assert(GetLastError() == ERROR_IO_PENDING);
/// *background activity* probably writing into EvtMask
/// until overlapped.hEvent gets signalled
}
В (практически все) случаях вызов функции указывает *background activity*
, я должен ждать на overlapped.hEvent
произойдет. Поскольку я также жду событий из альтернативных источников (например, IPC, вызванных пользовательским вводом, завершением программы), я использую функцию WaitForMuiltipleObjects()
. Но если блокировка ожидания завершена для других причин, кроме изменений в контрольной строке, как я могу остановить фоновую активность на EvtMask
? Код, на котором я основан, в настоящее время использует SetCommMask(hFile, 0)
, но я не нашел надежной ссылки для этого.
Я также наблюдаю случаи, когда изменения в строках управления не поддерживаются должным образом (драйвер ?, VM?), Поэтому я должен выполнить нарезное ожидание с промежуточной проверкой.
Что необходимо сделать, чтобы безопасно покинуть область, в которой объявлена переменная EvtMask
?
Вы должны вызвать CancelIo(). Пользовательский ввод обычно не является большой причиной для отмены ввода-вывода, конечно. У вас есть китайское печенье, в котором говорится, что вы полностью перепишете его. –
@ HansPassant haha, есть много, чтобы переписать ... – Wolf
@HansPassant Я изменил вопрос, есть еще одна (важная) причина, которую нужно учитывать. Теперь у вас больше смысла? Благодаря! – Wolf