3

在我的项目中,我需要读取和写入串行端口(RS232)。我正在使用重叠 IO 并使用两个单独的线程进行读写。

当我发出没有立即完成的写操作时,我开始等待 (WaitForMultipleObjects) 两个事件;分配给重叠结构的 hEvent 成员的事件,以及一个停止事件。当我想停止线程时,我通过调用 SetEvent() 发出停止事件信号。这会导致等待函数返回。因为写操作仍在等待中,所以我通过调用 CancelIO() 来取消操作。然后,我再次等待操作完成,现在使用 GetOverlappedResult() 并将 bWait 参数设置为 True。操作完成后,GetOverlappedResult() 返回 False,GetLastError() 返回 ERROR_OPERATION_ABORTED。

现在这是我的问题:

当 GetOverlappedResult() 返回 False,GetLastError() 返回 ERROR_OPERATION_ABORTED(表示操作已完成但已取消)时,lpNumberOfBytesTransfered 参数是否有效?换句话说,lpNumberOfBytesTransfered 是否在取消之前给了我实际的写入字节数?还是在这种情况下未定义 lpNumberOfBytesTransfered 参数?

4

1 回答 1

3

我将重复 Hans Passant 的评论,因为我认为他对我的问题给出了准确的答案:

这是一个驱动程序实现细节。周围有许多可能的串行端口驱动程序,它们通常由 USB 或蓝牙设备驱动程序模拟。通常质量有问题。标准的 Microsoft 驱动程序已经拒绝,当 IRP 被取消时,它会强制 IRP.IOStatus.Information 字段为 0。如果您无法承受数据丢失,请不要取消 I/O。

于 2013-10-23T13:34:19.313 回答