[問題] pipe buffer 會否造成 接收端卡住

看板C_and_CPP作者 ( )時間14年前 (2009/12/19 21:04), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 由於對 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
文章代碼(AID): #1BBCzEsu (C_and_CPP)