Seite 1 von 1

Speicher läuft voll bei QPainter Benutzung

Verfasst: 8. September 2008 12:38
von Mensch
Hallo Leute!

Ich habe folgendes Problem. In einer Methode, die in meiner Applikation mehrmals aufgerufen wird, werden Ellipsen in eine QPixmap gezeichnet. Für jeden Aufruf der Methode werden 3 zusätzliche Megabyte im RAM gefressen. Durch Debugging weiß ich, dass folgendes Codestück, genauer gesagt der QPainter, dafür verantwortlich ist.

QPainter p;
p.begin(imgPmp);
QPen pen;
pen.setWidth(5);
pen.setColor(this->currentColor);
p.setPen(pen);
p.drawEllipse(featureX-10,featureY-10,20,20);
p.end();

Wenn dieses Codestück weglasse (nur rechenen und nichts zeichnen) wird kein zusätzlicher Speicher gefressen. Ich habe schon versucht Painter und Pen dynamisch anzulegen und den Speicher nach Benutzung freizugeben, aber auch das hilft nicht weiter.

Hat jemand eine Idee was das Volllaufen des Speichers verursacht und wie ich das Vermeiden kann und trotzdem meine Funktionalität behalte?

Danke im Vorraus und viele Grüße!

Verfasst: 8. September 2008 12:58
von sigvdr
Sind die 3MByte die Größe von "imgPmp" ? Wird da jedes mal eine Kopie davon angelegt ?
Wie wurde "imgPmp" definiert ?

Gruß Sig

Verfasst: 8. September 2008 14:54
von Mensch
Eigentlich sind 3 MB zu viel. Die Pixmap hat eine Größe von 1024x768 Graustufen.

imgPmp wird in der ui_x.h folgendermaßen deklariert :

QPixmap *imgPmp;

In der Applikation wird es dann so definiert:

tmpPmp = QPixmap::fromImage(imgFile);
imgPmp = &tmpPmp;
scene->addPixmap(*imgPmp);

wenn ich den QPainter anlege sage ich doch nur in welche Pixmap gezeichnet werden soll. Dazu muss doch keine Kopie angelegt werden, oder? Und wenn das im Hintergrund passiert müsste der Speicher doch auch im Hintergrund wieder freigegeben werden, oder?

Grüße

Verfasst: 8. September 2008 18:59
von solarix
mal abgesehen davon, dass

Code: Alles auswählen

tmpPmp = QPixmap::fromImage(imgFile);
imgPmp = &tmpPmp;
scene->addPixmap(*imgPmp); 
vermutlich nicht das tut, was es deiner Meinung nach tun sollte, verwendest du bei

Code: Alles auswählen

 p.begin(imgPmp); 
einen Pointer, welcher auf ein nicht mehr existierendes Objekt zeigt...
was dann passiert ist undefiniert...

Verfasst: 8. September 2008 20:16
von Mensch
Also das Programm tut soweit was es soll. Und das Ergebnis ist auch nicht undefiniert, sondern es wird genau in das Objekt gezeichnet das ich will.

Mein Problem ist lediglich das Volllaufen des Arbeitsspeichers. Ich lege in besagter Methode ja einen QPainter an und der sollte nach Beendigung der Methode auch wieder gelöscht werden. Dennoch benötigt jeder Aufruf der Methode 3 neue MB im RAM (wenn ich nicht zeichne passiert nichts mit dem Speicher).

Hat dazu noch jemand eine Idee?

Danke im Voraus!

Verfasst: 8. September 2008 20:27
von solarix
Kannst du uns den Code der Methode rund um

Code: Alles auswählen

tmpPmp = QPixmap::fromImage(imgFile);
imgPmp = &tmpPmp;
scene->addPixmap(*imgPmp); 
geben?