Speicherbedarf eines Programms
-
Hallo,
ich hab ein kleines Programm geschrieben das ein Koordinatensystem und eine Kurve darstellt. Über zwei Radiobuttons kann man zwei verschiedenen Kurven anzeigen. Das Problem ist das bei jedem wechsel der Kurve das Programm ca 3MB neuen Speicher braucht und den auch nicht mehr freigibt.
Um die alte Kurve zu löschen verwende ich "pictureBox1.Refresh();".
Kann es daran liegen?Sascha
-
Wie zeichnest du denn deine Kurven?
-
sorry das ich mich nicht melde, mach es so:
public void ksystem_zeichnen(PictureBox obj_pb, int anz_werte, float[] werte, string[] x_name) { Pen myPen = new Pen(Brushes.Black); myPen.Width = 2.0F; myPen.LineJoin = System.Drawing.Drawing2D.LineJoin.Bevel; Point obj_p1 = new Point(); Point obj_p2 = new Point(); Graphics g = obj_pb.CreateGraphics(); double max_wert=werte[0]; //Maximum und Minimum von wert bestimmen for (int i = 1; i < anz_werte; i++) { if (max_wert < werte[i]) { max_wert = werte[i]; } } //x-Achse Skalierung int abstand = 220 / anz_werte; obj_p1.Y = 140; obj_p2.Y = 130; int j = 0; int y_pos; for (int i = 15; i < 235; i += abstand) { if (j < anz_werte) { //Balken zeichnen System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red); if (max_wert != 0) { y_pos = Convert.ToInt32((120 * (werte[j] / max_wert))); } else { y_pos = 0; } g.FillRectangle(myBrush, new Rectangle(i, 135 - y_pos, abstand, y_pos)); obj_p1.X = i; obj_p2.X = i; g.DrawLine(myPen, obj_p1, obj_p2); // X - Achse beschriften StringFormat format1 = new StringFormat(StringFormatFlags.DirectionVertical); g.DrawString(x_name[j], new Font(new FontFamily("Arial"), 8f, FontStyle.Regular), Brushes.Black, obj_p1.X + abstand / 3, obj_p1.Y, format1); // Balken beschriften g.DrawString(werte[j].ToString() + " km", new Font(new FontFamily("Arial"), 8f, FontStyle.Regular), Brushes.Black, obj_p1.X + abstand / 3, obj_p1.Y - 50, format1); } j++; } // X & Y - Achse zeichnen obj_p1.X = 15; obj_p1.Y = 135; obj_p2.X = 235; obj_p2.Y = 135; g.DrawLine(myPen, obj_p1, obj_p2); // x-Achse obj_p2.X = 15; obj_p2.Y = 15; g.DrawLine(myPen, obj_p1, obj_p2); // y-Achse }
Ich zeichne jetzt ein Koordinatensystem und darin Balken die die Werte angeben.
Hab das Problem so gelöst:class MemoryManagement { [DllImport("kernel32.dll")] private static extern bool SetProcessWorkingSetSize(IntPtr hProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize); public void Reduce() { ReduceMemoryUsage(); } private static void ReduceMemoryUsage() { try { GC.Collect(); GC.WaitForPendingFinalizers(); if (Environment.OSVersion.Platform == PlatformID.Win32NT) SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1); } catch { } } }
Ist nicht mein eigener Code hab ich von [url]http://www.computerbase.de/forum/showthread.php?t=394867 [/url], aber es geht. Rufe die Klasse mit einem Timer regelmäßig auf. Ist bestimmt nicht die saubere art aber es geht.
-
Auf den ersten Blick: Brush ist nach Gebrauch nicht freigegeben.
Bevor du fragst:
http://msdn.microsoft.com/en-us/library/aa287495(VS.71).aspxIch sehe da sogar noch andere Systemresourcen.
-
Unix-Tom schrieb:
Ich sehe da sogar noch andere Systemresourcen.
Jup, wie Pen, Font, FontFamily usw.
Und das noch in ner Schleife
Nach ner Weile dürfte der Code ne OutOfMemory Exception werfen. Alle Klassen die IDisposable implementieren, machen das meist nicht ohne Grund. Deshalb sollte man auch immer Dispose() aufrufen, bzw. gleich nen using(...) verwenden.
Das zeichnen ist auch an sich nicht sehr elegant gelöst mit dem CreateGraphics().
Besser wäre es direkt auf ne Bitmap zu zeichnen und die dann in die PictureBox zu laden. Oder noch schöner, wenns automatisch neu gezeichnet werden soll: In das entspechende Paint Event hängen und dort zeichnen.
-
seit ich die klasse MemoryManagement aufrufe, braucht mein Programm maximal 2mb speicher und wird nie mehr, auch wenn ich 100 mal die funktion zum zeichnen meines koordinatensystems aufrufe.
aber das mit dispose() verwenden soll hab ich auch schon gelesen. hab aber erst vor 2 wochen mit c# und .net programmierung angefangen, hab noch nicht richtig verstanden wie das mit der speicherfreigabe geht. bei c++ mach ich einfach delete und fertig.
-
Hallo
Du solltest dir mal das hier anschauen:
http://www.mycsharp.de/wbb2/thread.php?threadid=21782
chrische