Speicher läuft voll bei QPainter Benutzung

Alles rund um die Programmierung mit Qt
Antworten
Mensch
Beiträge: 50
Registriert: 16. März 2008 19:44

Speicher läuft voll bei QPainter Benutzung

Beitrag 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!
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Beitrag von sigvdr »

Sind die 3MByte die Größe von "imgPmp" ? Wird da jedes mal eine Kopie davon angelegt ?
Wie wurde "imgPmp" definiert ?

Gruß Sig
Mensch
Beiträge: 50
Registriert: 16. März 2008 19:44

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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...
Mensch
Beiträge: 50
Registriert: 16. März 2008 19:44

Beitrag 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!
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
Antworten