2013-10-22 34 views
2

在我的項目中,我需要讀取和寫入串行端口(RS232)。我正在使用重疊IO,並使用兩個單獨的線程進行讀寫。當GetLastError返回ERROR_OPERATION_ABORTED時,GetOverlappedResult的lpNumberOfBytesTransfered參數是否有效?

當我發出一個寫操作沒有立即完成時,我開始等待(WaitForMultipleObjects)兩個事件;分配給重疊結構的hEvent成員的事件和停止事件。當我想停止線程時,我通過調用SetEvent()來發出停止事件的信號。這會導致等待函數返回。由於寫操作仍然未決,我通過調用CancelIO()來取消操作。然後,我再等待操作完成,現在使用帶有bWait參數設置爲True的GetOverlappedResult()。當操作完成時,GetOverlappedResult()返回False,GetLastError()返回ERROR_OPERATION_ABORTED。

現在,這裏是我的問題:

當GetOverlappedResult()返回FALSE,並且GetLastError()返回ERROR_OPERATION_ABORTED(指示完成,但取消操作),是lpNumberOfBytesTransfered參數是否有效?換句話說,在取消之前,lpNumberOfBytesTransfered是否給了我寫入字節的實際數量?或者在這種情況下,lpNumberOfBytesTransfered參數是不確定的?

+0

由於您已經擁抱了線程,您爲什麼選擇使用異步I/O? Asynch I/O比阻塞I/O要複雜得多,既然您很高興將代碼移入線程,那麼使用阻塞I/O會更容易嗎?或者我錯過了爲什麼選擇aysnc的一些原因? –

+0

通過在單獨的線程中使用重疊的I/O,我可以在一個線程中執行ReadFile操作和WaitCommEvent操作,在另一個線程中執行WriteFile操作。而且由於它們是重疊的,我可以讓線程等待操作完成,並在停止事件中允許我取消操作。阻止I/O很難取消。 –

+0

好的,我現在明白了 –

回答

2

我會重複漢斯帕桑特的評論,因爲我覺得他給出了一個準確的回答我的問題:

這是一個驅動程序實現的細節。有許多可能的串行端口驅動程序,它們通常由USB或BlueTooth設備驅動程序仿真。往往質量有問題。標準的Microsoft驅動程序已經說不,它會在IRP被取消時強制IRP.IOStatus.Information字段爲0。如果您無法承受數據丟失,請勿取消I/O。

相關問題