Speicherfresser in OnPaint

08/02/2010 - 10:47 von Frank Weichert | Report spam
Moinmoin,
ich komme bei einem Speicherlast Problem nicht so recht weiter.
Unten ist der Code, mein Problem ist: Beim Starten nimmt die Applikation
ca 30 MB im Speicher ein (Taskmanager). Wenn ich dann mit einem anderen
Fenster über die Picturebox fahre und hin und her schiebe, dann steigt
der Speicherverbrauch schnell an. Ich habe schon bis 900 MB gesehen.
Dann làsst man die Applikation etwas ruhen, und der Speicher wird wieder
freigegeben, und es werden nur noch 35 MB belegt.

Wo kann ich dran drehen, damit nicht so viel speicher belegt wird?

Vielen Dank für ein paar Tipps,
schönen Gruss
Frank


void UpdateBitmap() {
Rectangle src= GetMaxDimension();
Rectangle dst= new Rectangle(0, 0, src.Width / 100 * trk.Value ,
src.Height / 100 * trk.Value);

Bitmap tmpBitmap = new Bitmap(srcDimension.Width, srcDimension.Height);
Graphics g = Graphics.FromImage(tmpBitmap);

int left = 0;
Bitmap tmp= null;
foreach (IDisplayPlugin plugin in _manager.PluginList) {
tmp = plugin.RenderSegment();
g.DrawImage(tmp, left, 0);
left += tmp.Width;
}

if (pbDisplay.Image == null)
pbDisplay.Image = new Bitmap(dstDimension.Width,dstDimension.Height);

g = Graphics.FromImage(pbDisplay.Image);
g.DrawImage(tmpBitmap, dstDimension, srcDimension, GraphicsUnit.Pixel);
g.Dispose();
tmpBitmap.Dispose();
}


Eine Typische Plugin.Rendersegment Methode ist:

public override Bitmap RenderSegment() {
Graphics g = Graphics.FromImage(_bufferBitmap);
// _bufferedBitmap und backGround
// werden beim Programmstart einmalig instanziert

g.Clear(_bgColor);
if (_backGround != null) {
g.DrawImage(_backGround, _src, _src, GraphicsUnit.Pixel);
DrawOverlay(g, _src);
}
g.Dispose();
return _bufferBitmap;
}
 

Lesen sie die antworten

#1 Konrad Neitzel
08/02/2010 - 11:07 | Warnen spam
Hallo Frank!

"Frank Weichert" wrote in message
news:

ich komme bei einem Speicherlast Problem nicht so recht weiter.



Nunja - ich sehe da kein Problem. Dein Code macht ja erst einmal alles
richtig, nur eben arbeitet der Garbage Collector Zeitversetzt und es
kann etwas Zeit dauer, bis Speicher freigegeben wird.

Wenn das Fenster oft neu gezeichnet werden muss, dann entsteht halt
einiges an belegtem Speicher, der beim nàchsten Lauf des GC freigegeben
wird.

Wenn man die Freigabe vom Speicher erzwingen will, dann wàre ein Aufruf
von GC.Collect möglich. Aber das halte ich für unnötig.
Speichermanagement würde ich bei sowas klar dem System überlassen.

Wichtig in dem Zusammenhang ist halt noch, dass Dispose() selbst erst
einmal keinen managed Speicher freigibt. (Unmanaged-Ressourcen werden
freigegeben, aber die Speicherfreigabe vom managed Seicher unterliegt
halt dem garbage collector.)

Ich hoffe, ich konnte etwas weiterhelfen.

Mit den besten Grüßen,

Konrad

Ähnliche fragen