[問題] pipe buffer 會否造成 接收端卡住
遇到的問題: (題意請描述清楚)
由於對 pipe/stdout/stdin 不太了解,以下敘述如果錯誤請不吝指教!!
這是延續之前的一個問題
#1B93smsk (C_and_CPP) [問題] 兩程式間傳資料 stdout 與 stdin 的問題
該問題已經在 LPH66 的協助下獲得解決
源自於引用 Vfw 函式的 AVIStreamRead() 會把一些"診斷用"訊號送到 stdout
但是本來想要的功能是利用 目標程式 AVS2WAV
把來源轉成標準 wave 從 stdout 輸出 因而造成的錯誤
解決辦法則是指定 pipe,再用 CreateProcess 呼叫其他程式
-------------------------------------------------------------
現在遇到的問題是,當使用 AVS2WAV 轉換比較大的檔案時
最後輸出會卡住
PS: AVS2WAV 讀取 input 送出 WAVE 到 stdout 給 Audio Encoder
而 Audio Encoder 有多種選擇,我用 NeroAACEnc
可以確定的是 AVS2WAV 產生訊息到 stdout 的速度 (12 秒) size = 125 MB
肯定比 NeroAACEnc 讀取 stdin 的速度還要快 (~60 秒)
猜想 pipe + CreateProcess 應該是
parent process 和 child process 同時都會跑吧???
然後兩個程式一邊跑,一邊傳資料 <---- 這樣對嗎?
由於資料傳輸速率不同步,想當然之間應該有 buffer
那有 buffer 遇到大檔就肯定會遇到不足的狀況
我能夠改寫的部份只有 avs2wav
後端的 audio encoder 沒有原始碼無法改寫
希望得到的正確結果:
請問有什麼辦法可以讓父程式可以隨時偵測 buffer 有沒有被寫爆
然後稍待一會兒,等到 buffer 被讀的差不多後再繼續寫
有想過或許指定超大 buffer 就好
但是很容易就會遇到處理的資料量達到 Giga byte 等級
不可能設置一個很大的 buffer
程式跑出來的錯誤結果:
整個流程被卡死,最終輸出檔被 child process 鎖定
開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
VC2008
有問題的code: (請善用置底文標色功能)
AVS2WAV 的部份,根本上用 pipe 的 code 我都從 MSDN 完整照抄來的
http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx
所以是 anonymous pipe
補充說明:
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.229.7.45
→
12/19 21:05, , 1F
12/19 21:05, 1F