[問題] BCB6 硬體作動時,記憶體不斷增加
看板C_and_CPP (C/C++)作者flylover (慢步調.. 很快樂)時間14年前 (2011/07/20 02:09)推噓4(4推 0噓 4→)留言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
07/20 02:27, 1F
→
07/20 02:28, , 2F
07/20 02:28, 2F
推
07/20 09:35, , 3F
07/20 09:35, 3F
→
07/20 10:13, , 4F
07/20 10:13, 4F
→
07/20 10:13, , 5F
07/20 10:13, 5F
→
07/20 10:14, , 6F
07/20 10:14, 6F
推
07/20 10:18, , 7F
07/20 10:18, 7F
推
07/20 20:42, , 8F
07/20 20:42, 8F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章