[問題] BCB6 硬體作動時,記憶體不斷增加

看板C_and_CPP (C/C++)作者 (慢步調.. 很快樂)時間14年前 (2011/07/20 02:09), 編輯推噓4(404)
留言8則, 4人參與, 最新討論串1/2 (看更多)
開發平台(Platform): Windows XPSP3 + BCB 6 額外使用到的函數庫(Library Used): DirectShow 9、DSPack 問題(Question): 搭配 DSPack 的 TFilter、TVideoWindow、TFilterGraph、TSampleGrabber 由 SampleGrabber 擷取 buffer 的 Bitmap (bmp)資料後放到 TImage 元件上, 正常運作情況下,工作管理員中的該程式所耗記憶體不太會改變(8KB~16KB), 但只要程式開始透過 RS232 丟資料給硬體、並透過 Sleep(30) 後去接收回應的訊息時, 工作管理員中該程式所耗的記憶體就會以數千 KB 成長, 由於程式是用於控制多項硬體使用,整個流程上,常常會丟訊息給硬體, 或等待數毫秒後,去讀取 RS232 Receive Buffer 上硬體的回覆訊息, 隨便跑幾個動作,耗用記憶體就會高速成長,(兩分鐘內由 2MB 衝到 200MB 以上) 直到系統顯示 Out of Memory 後當掉為止。 註: RS232 丟訊息或接收訊息的程式,我建一個 Thread 去持續傳送讀取, Sleep(30)亦是加在 Thread 中,試過 Application->ProcessMessage() 無效。 餵入的資料(Input): buffer from Frame Grabber Card 預期的正確結果(Expected Output):程式耗用的記憶體只有微幅變動 錯誤結果(Wrong Output): 耗用的記憶體隨著硬體的動作急速增加,沒有降下來的情況 程式碼(Code): /*SampleGrabber OnBuffer() */ SampleGrabber1->GetBitmap(Image1->Picture->Bitmap, buffer, buffer_length); /*RS232 Thread*/ /*send_msg(AnsiString str)是包來透過RS232傳遞command的函數, receive_msg(AnsiString str)是包來接收 RS232 Receive buffer 的函數*/ send_msg("IS"); Sleep(30); receive_msg(str); Sleep(30); 補充說明(Supplement): 1.只要我把 SampleGrabber 那段 mark 掉,耗用的記憶體就不變了 2.查過一些文章,有提到 MSDN 寫道, 透過 SampleGrabber 擷取圖片後,由於原設計是以 Thread 的方式不斷擷取, 若進行GDI的行為(繪在 TImage 上),會有 new Thread 卻 delete 不掉的問題發生, 但我改為: /*SampleGrabber OnBuffer() */ Graphics::TBitmap *bmp = new Graphics::TBitmap(); SampleGrabber1->GetBitmap(bmp, buffer, buffer_length); Image1->Picture->Bitmap->Assign(bmp);    問題仍然依舊,想尋求版上的前輩們的建議,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 112.104.22.52 ※ 編輯: flylover 來自: 112.104.22.52 (07/20 02:12) ※ 編輯: flylover 來自: 112.104.22.52 (07/20 02:13)

07/20 02:27, , 1F
找看看 SampleGrabber1->GetBitmap 有沒有成對的
07/20 02:27, 1F

07/20 02:28, , 2F
release function
07/20 02:28, 2F

07/20 09:35, , 3F
你有delete bmp嗎
07/20 09:35, 3F

07/20 10:13, , 4F
樓上您好,我有 delete,還是會一樣..
07/20 10:13, 4F

07/20 10:13, , 5F
這篇是昨晚打的,所以漏打了delete,抱歉
07/20 10:13, 5F

07/20 10:14, , 6F
我再找看看有沒有relase.. 印象中全部是這樣
07/20 10:14, 6F

07/20 10:18, , 7F
相關spec與指令再檢查一次. 反正問題點就是3樓說的那種.
07/20 10:18, 7F

07/20 20:42, , 8F
Project>Option>CodeGuard
07/20 20:42, 8F
文章代碼(AID): #1E9SXdcc (C_and_CPP)
文章代碼(AID): #1E9SXdcc (C_and_CPP)