WriteFile(tmp_pipe, &Time, sizeof(double), &dwWritten, NULL);
以上是同步的,如果tmp_pipe
的緩衝區用完了,它會在那裏等待。如何在c/C++中實現異步寫入?
如何使上述終點瞬間,也許只是忽略這些數據如果緩衝區滿了嗎?
WriteFile(tmp_pipe, &Time, sizeof(double), &dwWritten, NULL);
以上是同步的,如果tmp_pipe
的緩衝區用完了,它會在那裏等待。如何在c/C++中實現異步寫入?
如何使上述終點瞬間,也許只是忽略這些數據如果緩衝區滿了嗎?
比較可靠的方法是使用boost::asio
。
異步IO是非常困難的,如果你不使用一個好的庫得到正確和便攜。
如果你並不需要移植的代碼,然後使用Win32直接的罰款。
如果指定一個OVERLAPPED結構作爲最後一個參數的地址,那麼你將在稍後獲得有關異步寫入信息通過該OVERLAPPED結構。您需要以重疊模式打開文件。或者,您可以使用WriteFileEx並提供完成回調。閱讀MSDN docs瞭解更多詳情。
請注意,您仍然必須明智地處理管道上未完成I/O的情況。沒有辦法只是做'遺忘'寫入,忽略管道有限帶寬的事實。最終你會遇到一些內核緩衝池的限制,一個I/O將會失敗,可能會破壞你的管道,直到它重新啓動。
這是很難得到正確,但有很多樣品的在線幫助。要獲得額外的功勞,請使用爲用戶模式Windows提供異步I/O的最高性能的I/O完成端口。不能100%確定這適用於管道,但肯定適用於套接字和文件。
你有個例子嗎? – Alan 2010-09-08 18:12:13
試試這個:http://www.codeproject.com/KB/vb/AsyncNamedPipes.aspx或這個:http://www.codeproject.com/KB/winsdk/overlappedio.aspx – 2010-09-08 18:27:27
WriteFile是一個Win32 API,不是C/C++庫的一部分。 WriteFile文檔(http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx)指定如何將其用於異步操作。 – Michael 2010-09-08 17:36:09
對不起,我不明白,你能說明一下嗎? – Alan 2010-09-08 17:47:44