Я работаю с нестандартным модемом через последовательный порт с перекрытием. Помимо чтения и записи в телекоммуникационную линию, я должен проверить линии управления, такие как CTS и DSR, используя файл 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)
, но я не нашел надежной ссылки для этого.
Я также наблюдаю случаи, когда изменения в линиях управления не поддерживаются должным образом (драйвер?, ВМ?), поэтому мне приходится выполнять нарезанное ожидание с промежуточной проверкой.
Что нужно сделать, чтобы безопасно покинуть область, в которой объявлена переменная EvtMask
?