2013-04-08 43 views
0

我長期面對這個問題,並沒有找到任何可以幫助我解決問題的東西。 我使用TBitmap接收來自相機(流)的數據,然後將圖像保存到磁盤。 有時會發生異常。經過幾次測試後,我發現缺陷:TBitmap的Canvas的handle屬性值爲0.要繞過這個問題,當我在句柄中檢測到這個值0時,重新啓動應用程序(銷燬並重新創建TBitmap不起作用),但有時這個錯誤經常發生。有沒有人有這樣的問題?我可能做錯了什麼?歡迎任何幫助。謝謝。Delphi7:TBitmap.Canvas.Handle = 0

+0

看起來您的代碼中存在一個錯誤。所有的位圖訪問是否發生在同一個線程中? – 2013-04-08 20:38:23

+0

不是,它在所有跨線程訪問中受關鍵部分的保護。 – Valmir 2013-04-09 13:29:49

+0

就夠了。你不需要使用'Lock'。我必須說,我很驚訝你忘了提到代碼的線程方面。 – 2013-04-09 13:31:59

回答

-1

TBitmap內部使用TBitmap.Canvas的TBitmapCanvas包裝器對象。如果你有權訪問源代碼(Graphics.pas),你應該看看。機會是一個或多個WinAPI GDI調用在出錯時不處理返回值。一些GDI電話的失敗機率很小,因此忽略檢查每個返回的值以獲得一點性能是有點冒險的,但在高負載情況下,這可能是事情出錯的第一個指標無論如何。

我建議你嘗試使用調試DCU來逐步使用TBitmap.Canvas程序,列出用於使事情工作的GDI調用,然後編寫這些操作來檢查返回值並正確處理任何錯誤。這應該使您能夠了解當相機連接失敗時發生的更多情況,並且可能會減少使用TBitmap所帶來的一些開銷。