【问题标题】:Is the lpNumberOfBytesTransfered parameter of GetOverlappedResult valid when GetLastError returns ERROR_OPERATION_ABORTED?GetLastError 返回 ERROR_OPERATION_ABORTED 时,GetOverlappedResult 的 lpNumberOfBytesTransfered 参数是否有效?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-24
    • 2011-04-26
    • 2015-05-18
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多