【发布时间】:2017-05-18 14:30:33
【问题描述】:
我正在使用QThread 通过QPrinter 进行打印工作
我的PrintWorker 看起来像这样:
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();
}
而print 方法是这样的:
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();
}
}
现在在调用 print() 之前,我的应用在打印和调用 PrintWorker::print() 之后会暴露大约 9MB 的内存@我的应用的内存使用量达到 26MB
在另一个世界中,如果我们在 PrintWorker::print() 的最后部分删除 emit done,则没有任何区别。
我们期望在完成工作后内存使用量应该降至 26MB - 线程空间 + _printer + _printDialog 对象大小 ≈ 14MB
那么这有什么问题呢?
【问题讨论】:
-
你有没有尝试添加一个 qDebug 看看你的 print worker 的析构函数是否被调用?
-
@rafaelgonzalez.Yes
PrintWorker::~PrintWorker()被调用。
标签: c++ qt memory-leaks qt5 qprinter