私はC#でnewbyです。私は繰り返しワーカースレッドでGUIの画像ボックスを更新する必要があります。イメージは、表示されるイメージを取得するGetImageメソッドを使用してドライバをポーリングするカメラから取得されます。たとえ "using"という命令を使ってビットマップを割り当てて、明示的にG.Cを呼び出すとしても、メモリは決して割り当て解除されないようです。 DrawPictureメソッドはC#pictureboxメモリ解放問題
public void DrawPicture(object image, object lut)
{
[...]
// We have an image - cast it to proper type
System.UInt16[,] im = image as System.UInt16[,];
float[] lutTempConversion = lut as float[];
int lngWidthIrImage = im.GetLength(0);
int lngHeightIrImage = im.GetLength(1);
using (Bitmap bmp = new Bitmap(lngWidthIrImage, lngHeightIrImage)) {
[...many operation on bitmap pixel...]
// Bitmap is ready - update image control
//SetControlPropertyThreadSafe(tempTxtBox, "Text", string.Format("{0:0.#}", lutTempConversion[im[160, 100]]));
//tempTxtBox.Text = string.Format("{0:00000}", im[160, 100]);
//System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());
pic.Image = System.Drawing.Image.FromHbitmap(bmp.GetHbitmap());
}
}
の問題のようなものではあるが
pic.Image = System.Drawingで発生し
while (true) { // request image with IR signal values (array of UInt16) image = axLVCam.GetImage(0); lut = axLVCam.GetLUT(1); DrawPicture(image, lut); //GC.Collect(); }
:
ワーカースレッドがこのようなものです.Image.FromHbitmap(bmp.GetHbitmap());
実際には、コード行にコメントすると、ガベージコレクションは正常に動作します。 より良い、問題は、このメモリリークを解決するために
System.Drawing.Image.FromHbitmap(bmp.GetHbitmap())
何かアドバイスであると思われますか?
ありがとうございます!
問題は彼がGDIオブジェクトを処分していないことです。 –
@ヤニック:良い点。両方の問題がガベージコレクタに問題を引き起こすと思います。 –
実際、Dispose on Imageを呼び出すと、 'FromHbitmap()'を呼び出すときに割り当てられるアンマネージドリソースを処分できます。しかし、現在のソリューションでは、 'GetHbitmap()'を呼び出すときに作成されるアンマネージGDIオブジェクトは無視されます。 –