我正在通過串行端口以重疊的方式處理非標準調制解調器。除了從電信線路讀取和寫入,我必須檢查控制線,如CTS和DSR使用WaitCommEvent()
函數。取消WaitCommEvent重疊串行I/O
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()。用戶輸入通常不是取消I/O的理由。你有一箇中國幸運餅乾,說你會完全重寫這個。 – 2014-09-22 12:08:59
@HansPassant哈哈,有很多重寫... – Wolf 2014-09-22 12:18:06
@HansPassant我改變了這個問題,還有另一個(重要的)理由被考慮。現在它對你更有意義嗎?謝謝! – Wolf 2014-10-10 11:59:19