2012-04-23 52 views
2

我調用該方法win32::WriteFile,然後我打電話是否可以調用WriteFile並且應用程序將永遠等待回調?

WaitForSingleObject(handle, INFINITE) 

與我在電話WriteFile使用相同的句柄。

是否有可能有一些情景,以便我會永遠等待......並且WriteFile不會完成他的寫作?我打算寫512 kB,我假設我的硬件沒有問題。

我希望得到FAIL而不是等到永遠。

+0

您必須使用帶有某些標誌的OVERLAPPED IO才能進行非阻塞式寫入系統調用。 – RedX 2012-04-23 11:48:29

+0

我知道了......試試吧:) – Yanshof 2012-04-23 12:25:13

+0

然後我不明白你的問題......也許你可以重新翻譯它或者發表一些代碼來澄清。 – RedX 2012-04-23 12:27:01

回答

1

當您進行重疊I/O調用時,您將責任委派給驅動程序,以確保及時完成它。如果驅動程序有錯誤或者硬件功能失常,那麼沒有什麼合理的辦法可以做到,當這樣的低級操作失敗時,程序不能繼續以有用的方式操作。

當心,你已經通過了一項指針,司機是爲了填補一個緩衝區,繼續超時到期後運行留下了懸擺指針,一個司機可能使用噴字節到你的過程時它實際上設法完成請求。你至少必須調用CancelIo()來解決這個問題。如果返回false,則終止進程。

這一切都毫無意義,您需要從操作系統提供最低限度的服務保證。你也可以在沒有OVERLAPPED的情況下調用WriteFile()。同樣的越野車司機現在將掛起你的程序。就像CancelIo()不會掛起一樣。沒關係,這是有問題的驅動程序,而不是你。這並不是說用戶不會注意到機器存在嚴重問題,其他程序也會遭受這種不幸。

不要編寫處理非常不可能的轉角情況的代碼。最重要的是,不要編寫無法有效測試的代碼。

+0

哦,等等..這是重疊IO? :(((什麼句柄是OP等待? – 2012-04-23 13:37:50

1

這不應該發生,但它通常與一些'不太理想'的驅動程序。網絡操作在返回之前可能需要很長時間,所以我建議你應用一個很長的超時時間,也許是2分鐘(1000 * 60 * 2),如果超時,關閉/重新打開並重試writeFile()。

相關問題