ich QThread
für den Druck der Arbeit über QPrinter
Speicherleck, wenn QThread und QPrinter mit
Mein PrintWorker
sieht wie folgt mit:
class PrintWorker : public QObject {
Q_OBJECT
public:
PrintWorker(QThread*, QPrinter*, QPicture*, QPainter*, QObject *parent = 0);
private:
QPicture *_picture = nullptr;
QPrinter *_printer = nullptr;
QPainter *_painter = nullptr;
public slots:
void print();
signals:
void done();
};
PrintWorker::PrintWorker(QThread *thread, QPrinter *printer, QPicture *picture, QPainter *painter, QObject *parent) :QObject(parent),
_picture(picture), _printer(printer), _painter(painter)
{
moveToThread(thread);
QObject::connect(thread, &QThread::started, this, &PrintWorker::print);
QObject::connect(this, &PrintWorker::done, thread, &QThread::quit);
QObject::connect(this, &PrintWorker::done, this, &PrintWorker::deleteLater);
QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);
}
void PrintWorker::print() {
// do some print job with painter and picture
emit done();
}
Und print
Methode ist folgende:
void NewService::print() {
if (!_printer) { /* _printer : a private member */
_printer = new QPrinter(QPrinter::HighResolution);
_printer->setPageSize(QPrinter::A5);
_printer->setPageOrientation(QPageLayout::Portrait);
_printer->setColorMode(QPrinter::Color);
}
if (!_printDialog) { /* _printDialog : a private member */
_printDialog = new QPrintDialog(_printer);
}
if (_printDialog->exec() == QPrintDialog::Accepted) {
MyWidget *widget = new MyWidget(/* some args*/);
QPainter *painter = new QPainter;
QPicture *picture = new QPicture;
widget->render(picture);
QThread *thread = new QThread;
PrintWorker *worker = new PrintWorker(thread, _printer, picture, painter);
thread->start();
}
}
Vor dem Aufruf von print()
macht meine App nach dem Drucken und Aufruf vonca. 9MB Speicher verfügbarmeine Speicherauslastung der App erhalten 26MB
In einer anderen Welt, wenn wir emit done
letzten Teil entfernen in PrintWorker::print()
macht es keinen Unterschied.
Was wir nach Beendigung der Arbeit erwarten ist die Speichernutzung zu 26MB herunterkommen sollte - Gewinde Raum + _printer
+ _printDialog
Objekte Größe ≈ 14MB
So was mit diesem falsch?
haben Sie eine qDebug sehen, ob der destructor Ihres Druck Arbeiter genannt wird immer hinzuzufügen versucht? –
@ rafaelgonzalez.Ja 'PrintWorker :: ~ PrintWorker()' wird aufgerufen. – IMAN4K