在我的項目中,我需要讀取和寫入串行端口(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參數是不確定的?
由於您已經擁抱了線程,您爲什麼選擇使用異步I/O? Asynch I/O比阻塞I/O要複雜得多,既然您很高興將代碼移入線程,那麼使用阻塞I/O會更容易嗎?或者我錯過了爲什麼選擇aysnc的一些原因? –
通過在單獨的線程中使用重疊的I/O,我可以在一個線程中執行ReadFile操作和WaitCommEvent操作,在另一個線程中執行WriteFile操作。而且由於它們是重疊的,我可以讓線程等待操作完成,並在停止事件中允許我取消操作。阻止I/O很難取消。 –
好的,我現在明白了 –