2010-09-08 47 views
1
WriteFile(tmp_pipe, &Time, sizeof(double), &dwWritten, NULL); 

以上是同步的,如果tmp_pipe的緩衝區用完了,它會在那裏等待。如何在c/C++中實現異步寫入?

如何使上述終點瞬間,也許只是忽略這些數據如果緩衝區滿了嗎?

+4

WriteFile是一個Win32 API,不是C/C++庫的一部分。 WriteFile文檔(http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx)指定如何將其用於異步操作。 – Michael 2010-09-08 17:36:09

+0

對不起,我不明白,你能說明一下嗎? – Alan 2010-09-08 17:47:44

回答

2

比較可靠的方法是使用boost::asio

異步IO是非常困難的,如果你不使用一個好的庫得到正確和便攜。

+1

你爲什麼覺得很難得到正確的?我不認爲我曾經犯過一個錯誤,即使是最初的幾次。 – wallyk 2010-09-08 17:41:09

+12

我的天哪,你是我公司一直在尋找這些年的神話般的完美程序員。 :P – wheaties 2010-09-08 17:47:22

0

如果你並不需要移植的代碼,然後使用Win32直接的罰款。

如果指定一個OVERLAPPED結構作爲最後一個參數的地址,那麼你將在稍後獲得有關異步寫入信息通過該OVERLAPPED結構。您需要以重疊模式打開文件。或者,您可以使用WriteFileEx並提供完成回調。閱讀MSDN docs瞭解更多詳情。

請注意,您仍然必須明智地處理管道上未完成I/O的情況。沒有辦法只是做'遺忘'寫入,忽略管道有限帶寬的事實。最終你會遇到一些內核緩衝池的限制,一個I/O將會失敗,可能會破壞你的管道,直到它重新啓動。

這是很難得到正確,但有很多樣品的在線幫助。要獲得額外的功勞,請使用爲用戶模式Windows提供異步I/O的最高性能的I/O完成端口。不能100%確定這適用於管道,但肯定適用於套接字和文件。

+0

你有個例子嗎? – Alan 2010-09-08 18:12:13

+0

試試這個:http://www.codeproject.com/KB/vb/AsyncNamedPipes.aspx或這個:http://www.codeproject.com/KB/winsdk/overlappedio.aspx – 2010-09-08 18:27:27