2010-08-02 85 views
11

我從Win32的使用CreateProcess產卵的處理,設定STARTUPINFOhStdOutputhStdError性質管禁用緩衝處理與CreatePipe創建。我有兩個線程正在讀取管道,等待數據變爲可用(或者需要完成的過程,此時它會檢查在終止線程之前沒有剩下數據)。
隨着數據變得可用,我將輸出寫入有效的大文本框。上重定向標準輸出管(Win32 API的,C++)

發生什麼事是輸出被緩衝,所以緩慢運行的過程只是獲取文本框中的大量數據,而不是「正好發生」。

我不確定它是做緩衝的管道,還是與重定向有關的東西。

是否有任何方法將管道設置爲無緩衝區,或者以儘可能快地發送標準輸出的方式啓動進程?

我正在與一個測試應用程序,打印線相隔一秒

Here is line one 
(waits one second) 
Here is line two 
(waits one second) 
... etc 
+0

流程在寫入控制檯時流暢嗎?在linux上,這是一個相當知名的問題,解決方案是分配一個僞tty,因爲當輸出不是tty時某些程序會激活緩衝。在Windows上,檢查stdout的文件類型並不常見,所以我不希望緩衝區進入管道和控制檯。 – 2010-08-02 06:19:14

+0

是的,當它在控制檯(即。cmd.exe)上時,它按照預期流出,具有延遲等。 – 2010-08-02 06:28:56

+0

過程如何寫入標準輸出?我想你可能會打開C或C++流緩衝。 – wilx 2010-08-02 08:08:27

回答

4

緩衝可能是在C運行時(的printf等)並沒有什麼可以做這件事(IIRC它確實isatty()爲其檢查以確定一個緩衝策略)

+0

這將是POSIX中的答案。但Windows沒有tty的概念,也沒有任何'isatty'功能。 – 2010-08-02 13:21:52

+1

@Ben Voigt:MS c運行時仍然有它:http://msdn.microsoft.com/en-us/library/f4s0ddew%28v=VS.80%29.aspx – Anders 2010-08-02 15:34:08

+0

搖頭驚訝在「.NET框架等效「列表,其中沒有任何方式等效於任何形式 – 2010-08-02 15:51:00

0

SetNamedPipeHandleState,但它僅控制緩衝遠程管道,而不是當兩端是相同的計算機上進行測試。

+0

是的,我已經看到了,但正如你所說的,當兩端都在同一臺計算機上時,它不會改變任何東西。 – 2010-08-02 06:31:22

0

在我看來,你如果設置了hStdOutputSTARTUPINFO管道處理與CreatePipe創建hStdError,但不是你創建一個命名管道可以解決問題(與CallNamedPipe功能就像你使用,如果還使用SECURITY_ATTRIBUTES與bInheritHandle = TRUE之前,見http://msdn.microsoft.com/en-us/library/aa365782.aspx),然後通過名稱在CreateFile使用FILE_FLAG_WRITE_THROUGH標誌。通過指定 FILE_FLAG_OVERLAPPED

管客戶端可以使用的CreateFile來 啓用重疊模式或通過指定 FILE_FLAG_WRITE_THROUGH使 寫模式:就像你可以在MSDN(http://msdn.microsoft.com/en-us/library/aa365592.aspx)讀取。

所以才重新打開該管道與尊重CreateFile使用FILE_FLAG_WRITE_THROUGH標誌,並設置在手柄/手柄來hStdOutputSTARTUPINFOhStdError

+1

FILE_FLAG_WRITE_THROUGH 0x80000000 直寫模式已啓用。此模式僅影響字節類型管道上的寫入操作,然後僅在客戶機和服務器進程位於不同計算機上時才**。**如果啓用此模式,寫入命名管道的函數在寫入數據之前不會返回通過網絡傳輸,並位於遠程計算機的管道緩衝區中。如果未啓用此模式,則系統通過緩存數據來提高網絡操作的效率,直到最小字節數累積或經過最長時間爲止。 – 2010-08-02 13:21:01

相關問題