2

QNetworkAccessManager (Qt を使用) を使用しているときに、メモリ リークの問題が発生します。呼び出すリクエストが多いほど、より多くのメモリが割り当てられます。これは理にかなっていますが、私のやり方ではそうではありません。たとえば 16 のリクエストを呼び出し、ネットワークの応答が 16 回ヒットすると、次の 16 を呼び出します。何らかの理由でそうではなく、より多くの呼び出しが行われるにつれて、メモリは着実に増加します。これをスレッドに入れることはこれに影響を与える可能性がありますか?

ヘッダ:

#include <QThread>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QSemaphore>
#include <QPixmap>
#include <QMutex>
#include <QDebug>

#include "winnames.h"

#define MAX_REQUEST_COUNT 16

class Downloader : public QThread
{
    Q_OBJECT
public:
    explicit Downloader(QObject *parent = 0);
    void start(Priority = InheritPriority);

signals:
    void PictureDownloaded(QPixmap picture, QString id);

public slots:
    void networkReply(QNetworkReply*);

private:
    void startDownloads();

    QString titleID;
    QNetworkAccessManager *manager;

    int amount;
};

CPP:

#include "downloader.h"

Downloader::Downloader(QObject *parent) : QThread(parent)
{
    manager = new QNetworkAccessManager(this);
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkReply(QNetworkReply*)));
}
void Downloader::start(Priority p)
{
    amount = 0;
    titleID = "50";
    startDownloads();
}

void Downloader::startDownloads()
{
    const int searchValues[] = {0, 0x400, 0x1000, 0x8000, 0xFFFF};
    for (int x = 0; x < 4; x++)
    {
        int num = searchValues[x] + amount;
        if (num >= searchValues[x + 1])
            continue;

        for (int i = 0; i < MAX_REQUEST_COUNT; i++)
            manager->get(QNetworkRequest(QUrl("http://my.url/" + titleID.toUpper() + "/someDir/" + QString("%1").arg(num + i, 4, 16, QChar('0')).toUpper())));
    }
}

void Downloader::networkReply(QNetworkReply *reply)
{
    if (reply->bytesAvailable() != 0)
    {
        QPixmap pixmap;
        pixmap.loadFromData(reply->readAll(), "PNG");
        if (!pixmap.isNull())
            emit PictureDownloaded(pixmap, titleID + reply->url().toString().mid(reply->url().toString().length() - 4));
    }
    reply->deleteLater();
    reply->close();

    QMutex m;
    m.lock();

    if (amount++ != 0 && amount % MAX_REQUEST_COUNT == 0)
        startDownloads();

    m.unlock();
}

何か案が?ありがとう!

4

0 に答える 0