【发布时间】:2013-10-31 07:43:22
【问题描述】:
在我的项目中,我需要读取和写入串行端口 (RS232)。我正在使用重叠 IO 并使用两个单独的线程进行读取和写入。
当我发出没有立即完成的写操作时,我开始等待 (WaitForMultipleObjects) 两个事件;分配给重叠结构的 hEvent 成员的事件,以及一个停止事件。当我想停止线程时,我通过调用 SetEvent() 发出停止事件信号。这会导致等待函数返回。因为写操作仍在等待中,所以我通过调用 CancelIO() 来取消操作。然后,我再次等待操作完成,现在使用 GetOverlappedResult() 并将 bWait 参数设置为 True。操作完成后,GetOverlappedResult() 返回 False,GetLastError() 返回 ERROR_OPERATION_ABORTED。
现在这是我的问题:
当 GetOverlappedResult() 返回 False,GetLastError() 返回 ERROR_OPERATION_ABORTED(表示操作已完成但已取消)时,lpNumberOfBytesTransfered 参数是否有效?换句话说,lpNumberOfBytesTransfered 是否在取消之前给了我实际的写入字节数?还是这种情况下lpNumberOfBytesTransfered参数未定义?
【问题讨论】:
-
既然你已经在拥抱线程,为什么还要选择使用异步 I/O?异步 I/O 比阻塞 I/O 复杂得多,既然您乐于将代码移动到线程中,那么使用阻塞 I/O 肯定更容易吗?还是我错过了您选择 aysnc 的一些原因?
-
通过在单独的线程中使用重叠 i/o,我可以在一个线程中发出 ReadFile 操作和 WaitCommEvent 操作,在另一个线程中发出 WriteFile 操作。而且因为它们是重叠的,我可以让线程等待操作完成,并等待停止事件,从而允许我取消操作。阻止 i/o 更难取消。
-
这是一个驱动实现细节。周围有许多可能的串行端口驱动程序,它们通常由 USB 或蓝牙设备驱动程序模拟。通常质量有问题。标准的 Microsoft 驱动程序已经拒绝,当 IRP 被取消时,它会强制 IRP.IOStatus.Information 字段为 0。如果您无法承受数据丢失,请不要取消 I/O。
-
谢谢@HansPassant。我愿意接受您的评论作为答案,但 cmets 无法做到这一点。
-
我已经发布了一个答案,但很快就被否决了。不知道为什么,当反对者不分享他们的知识时,很难学到新东西。 Afaik,我的评论是准确的。随意将其复制到您自己的帖子中并将其标记为答案。
标签: windows winapi io overlapped-io