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_Queue

    Dein Ansatz ist unsauber und funktioniert nur mit Glück (Thread.Sleep())



  • Besten Dank


Anmelden zum Antworten