Hilfe zum Finden von Momory leake
-
Hallo zusammen,
ich versuche mal Queue von unter C# zu verwenden. Dabei stoße ich auf ein Problem, dass Speicher Verwendung immer steigt bis das Programm abstürzt.
private Queue q_image0 = Queue.Synchronized(new Queue()); private Queue q_image1 = Queue.Synchronized(new Queue()); private Queue q_image2 = Queue.Synchronized(new Queue()); private Queue q_strFileName0 = Queue.Synchronized(new Queue()); private Queue q_strFileName1 = Queue.Synchronized(new Queue()); private Queue q_strFileName2 = Queue.Synchronized(new Queue()); Bitmap m0, m1, m2; bool bTh0Run,bTh1Run,bTh2Run = false; // dieser Teil befindet sich in Main switch (iNrImage % 3) { case 0: m0 = new Bitmap(m_bitmap0); q_image0.Enqueue(m0); q_strFileName0.Enqueue(strNewDirName + "\\" + iNrImage + "a.jpeg"); if (bTh0Run == false) { myThread0 = new Thread(SaveAllImages0); myThread0.Start(); Thread.Sleep(5); } break; case 1: m1 = new Bitmap(m_bitmap0); q_image1.Enqueue(m1); q_strFileName1.Enqueue(strNewDirName + "\\" + iNrImage + "b.jpeg"); if (bTh1Run == false) { myThread1 = new Thread(SaveAllImages1); myThread1.Start(); Thread.Sleep(5); } break; case 2: m2 = new Bitmap(m_bitmap0); q_image2.Enqueue(m2); q_strFileName2.Enqueue(strNewDirName + "\\" + iNrImage + "c.jpeg"); if (bTh2Run == false) { myThread2 = new Thread(SaveAllImages2); myThread2.Start(); Thread.Sleep(5); } break; default: break; } // von diesem Teil gibt 3 mal private void SaveAllImages0() { bTh0Run = true; Bitmap m_Bild = null; int x = 0; int iDirNo = 1; time = DateTime.Now; string strDirName = strDirBase + "\\" + time.ToString(format); string strDirNameNew = null; //System.IO.Directory.CreateDirectory(strDirName + "\\" + iDirNo.ToString()); // strDirNameNew = strDirName + "\\" + iDirNo.ToString(); //if (progressBar1.InvokeRequired) //{ // Wenn Invoke nötig ist, ... // // dann rufen wir die Methode selbst per Invoke auf // progressBar1.Invoke(new MethodInvoker(SaveAllImages)); // return; //} while (q_image0.Count != 0 && q_strFileName0.Count!=0) { // x=(int)q_INr0.Dequeue(); x++; iThreadimageNr++; m_Bild = (Bitmap)q_image0.Dequeue(); strDirNameNew = (string)q_strFileName0.Dequeue(); m_Bild.Save(strDirNameNew, System.Drawing.Imaging.ImageFormat.Jpeg); // m_Bild.Save("D:\\image\\" + iThreadimageNr.ToString()+".jpeg", System.Drawing.Imaging.ImageFormat.Jpeg); Thread.Sleep(5); if (q_image0.Count < 20) Thread.Sleep(20); } bTh0Run = false; }
kann jemand Tipp geben was hier schief läuft
Danke im Voraus.
-
Sorry!
-
Wenn Du die Bilder nicht mehr benötigst, rufe Dispose() der Bitmap-Klasse auf.
-
Auf welche Stelle bitte? nachdem Speichern ? oder nachdem Zufügen in dem Queue?
m0.dispose();
oder
m_Bild.dispose(); // soll ich schon in der Schleife machen oder reicht es nur ein mal, wenn ich den Thread verlasse.Danke.
-
Nach dem Speichern natürlich frühestens.
-
Und bitte mal folgendes lesen:
http://www.albahari.com/threading/part4.aspx#_Wait_Pulse_Producer_Consumer_QueueDein Ansatz ist unsauber und funktioniert nur mit Glück (Thread.Sleep())
-
Besten Dank