QNetworkAccessManager线程永远不会结束

4
我知道在4.8版本中,每个HTTP请求都会有自己的线程来运行。
我正在开发一个链接检查应用程序,它在while循环中执行大量的HTTP请求,并且我注意到在Windows任务管理器中,我的应用程序使用了超过1600个线程,而且这个数字从不下降,只会增加直到崩溃应用程序。 (我猜这就是原因。)
我的问题是,QNetworkAccessManager是否有使用线程池的选项?
或者它是否有在完成其HTTP请求后清除其线程的选项?
以下是主循环:
while(!rpm_urlStack->isEmpty())
{
    QString url = rpm_urlStack->top();

    //define the reply
    QNetworkReply *reply;
    rpm_urlStack->pop();

    QString urlForReq(url);

    bool returnVal = true;
    QNetworkRequest request;

    request.setUrl(QUrl(urlForReq));
    request.setRawHeader("User-Agent", USER_AGENT.toUtf8());
    request.setRawHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    request.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    request.setRawHeader("Accept-Language", "en-us,en;q=0.5");
    request.setRawHeader("Connection", "Keep-Alive");

    QEventLoop loop;
    reply = m_networkManager->get(request);
    connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exit();

    if(!loop.isRunning()) {
        loop.exec();
    }

    RequestFinishedHandler(reply);

    // this is how I delete the reply object
    delete reply;
}

RequestFinishedHandler(QNetworkReply *reply)
{
    if (reply->error() > 0) {
        QNetworkReply::NetworkError networkError = reply->error();
        QString err = reply->errorString();
    } else {
        QVariant vStatusCodeV = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
        QMutexLocker lock(_pMutex); // _pMutex defined as class member
        char *buffer;
        buffer = getCurrentDateTime();
        QTextStream out(m_file);
        out << buffer << "  " << _sCurrentUrl << "\n";
        lock.unlock();

        if(vStatusCodeV.toInt() == 200) {
            QString ApiResponse;
            QByteArray data;
            data=reply->readAll();
            ApiResponse.append(QString::fromUtf8(data));
        }
    }
}

RequestFinishedHandler 函数是做什么的? - didierc
1个回答

1

看起来为了有效,deleteLater方法必须在事件循环内调用,该事件循环必须重新获得控制权以处理垃圾回收。

也许您应该重构代码,使事件循环替换while循环。或者,由于您没有使用finished插槽来处理回复,因此您可以在RequestFinishedHandler函数结束时直接删除回复。


它不起作用,我手动删除了回复对象,但线程仍然在运行。 - user63898
请在你的问题中添加这个更改。 - didierc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接