【发布时间】:2014-09-22 11:46:41
【问题描述】:
我正在通过串行端口以重叠方式处理非标准调制解调器。除了读取和写入电信线之外,我还必须使用WaitCommEvent()函数检查控制线,如CTS和DSR。
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的范围?
【问题讨论】:
-
你必须调用 CancelIo()。当然,用户输入通常不是取消 I/O 的重要理由。你有一个中国幸运饼干,上面写着你要完全重写。
-
@HansPassant 哈哈,还有很多东西要重写...
-
@HansPassant 我改变了问题,还有另一个(重要的)原因需要考虑。现在对你来说更有意义了吗?谢谢!
-
@Hans:不,你没有。
-
@BenVoigt 所以这个问题在你看来是有效的?
标签: windows serial-port modem handshake overlapped-io