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!
Speicher läuft voll bei QPainter Benutzung
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
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
mal abgesehen davon, dass
vermutlich nicht das tut, was es deiner Meinung nach tun sollte, verwendest du bei
einen Pointer, welcher auf ein nicht mehr existierendes Objekt zeigt...
was dann passiert ist undefiniert...
Code: Alles auswählen
tmpPmp = QPixmap::fromImage(imgFile);
imgPmp = &tmpPmp;
scene->addPixmap(*imgPmp);
Code: Alles auswählen
p.begin(imgPmp);
was dann passiert ist undefiniert...
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!
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!
Kannst du uns den Code der Methode rund um
geben?
Code: Alles auswählen
tmpPmp = QPixmap::fromImage(imgFile);
imgPmp = &tmpPmp;
scene->addPixmap(*imgPmp);