加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – QNetworkAccessManager线程永远不会完成

发布时间:2020-12-16 07:02:03 所属栏目:百科 来源:网络整理
导读:我知道在4.8版本中,每个http请求都有自己的线程来运行. 我正在做一个链接检查应用程序,它在while循环中执行了很多http请求,我在 Windows任务管理器中注意到我的应用程序随着时间的推移使用了超过1600个线程并且数量永远不会下降,直到它崩溃为止该应用程序. (
我知道在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));
        }
    }
}

解决方法

要使有效的 appears,必须从事件循环中调用deleteLater方法,该循环必须重新获得对执行的控制以处理垃圾收集.

也许你应该重构你的代码,让事件循环取代你的while循环.或者,由于您没有使用完成的槽来处理回复,因此您可以直接在RequestFinishedHandler函数的末尾删除回复.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读