1

リストからURLを取得し、それぞれをQNetworkRequestに送信し、HTMLを受け取って処理します。ただし、処理するリクエストは何千もあります。そのため、これらすべてのリクエストを一度に生成するのを停止するまで、アプリケーションはハングし続けました。

これは、多数のリクエストに対して que を処理するための儀式的な方法ですか? URL の Qqueue を使用してみました。これは、各 QNetworkReply 応答の後にトリガーされる SLOT にリンクします。

ジョブ リストを作成し、que に追加する

QQueue<QString> jobs;
for (int i = 1; i <= totalPages; i++){
    QString pageUrl = url + "&page=" + QString::number(i);
    jobs.enqueue(pageUrl);
}

qDebug() << "Total Jobs : " << jobs.count() << endl;
for (int i = 0; i < 5; i++){
    processQueue();
}

次に getHtml 関数内

QNetworkAccessManager *manager = new QNetworkAccessManager(this);
    QNetworkRequest *getHtmlRequest = new QNetworkRequest(pageUrl);
    getHtmlRequest = new QNetworkRequest(url);
    getHtmlRequest->setRawHeader( "User-Agent", "Mozilla/5.0 (X11; U; Linux i686 (x86_64); "
                               "en-US; rv:1.9.0.1) Gecko/2008070206 Firefox/3.0.1" );
    getHtmlRequest->setRawHeader( "charset", "utf-8" );
    getHtmlRequest->setRawHeader( "Connection", "keep-alive" );
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyGetPageHtmlFinished(QNetworkReply*)));
    connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(processQueue()));
    manager->get(*getHtmlRequest);

どのトリガー

void checkNewArrivalWorker::processQueue(){
if (jobs.isEmpty()){
    qDebug() << "Jobs Completed" << endl;
    emit finished();
} else {
    QString pageUrl = jobs.dequeue();
    QString pageNumber = pageUrl.mid(pageUrl.indexOf("page=") + 5);
    getHtml(pageUrl, pageNumber);
}
}
4

0 に答える 0