在我的项目中,我需要读取和写入串行端口(RS232)。我使用重叠IO并使用两个单独的线程进行读写。
当我发出一个没有立即完成的写操作时,我开始在两个事件上等待(WaitForMultipleObjects);分配给重叠结构的hEvent成员的事件和停止事件。当我想要停止线程时,我通过调用SetEvent()来发出stop事件的信号。这会导致wait函数返回。因为写操作仍处于暂挂状态,所以我通过调用CancelIO()来取消操作。然后,我等待操作完成,现在使用GetOverlappedResult()并将bWait参数设置为True。操作完成后,GetOverlappedResult()返回False,GetLastError()返回ERROR_OPERATION_ABORTED。
现在这是我的问题:
当GetOverlappedResult()返回False,并且GetLastError()返回ERROR_OPERATION_ABORTED(表示已完成但已取消的操作)时,lpNumberOfBytesTransfered参数是否有效?换句话说,lpNumberOfBytesTransfered会在取消之前给出实际的写入字节数吗?或者在这种情况下lpNumberOfBytesTransfered参数是否未定义?
答案 0 :(得分:3)
我将重复Hans Passant的评论,因为我认为他对我的问题给出了准确的答案:
这是一个驱动程序实现细节。有许多可能的串行端口驱动程序,它们通常由USB或BlueTooth设备驱动程序模拟。通常质量有问题。标准的Microsoft驱动程序已经说不,它会在IRP取消时强制IRP.IOStatus.Information字段为0。如果您无法承受数据丢失,请不要取消I / O.