QnetworkAccessManager线程永远不会完成
QNetworkAccessManager threads never finish
我知道,在版本4.8中,每个http请求都可以运行自己的线程。
我正在执行一个链接检查器应用程序,该应用程序在一段时间内执行了很多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));
}
}
}
似乎必须从事件循环中调用deleteLater
方法,该方法必须重新获得执行控制以处理垃圾收集。
也许您应该重构代码以使事件循环更换您的时循环。另外,由于您不使用finished
插槽来处理回复,也许您可以在RequestFinishedHandler
函数末尾直接删除答复。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 在C++中使用cURL和多线程
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在cuda线程之间共享大量常量数据
- 如何将元素添加到数组的线程安全函数?
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- Qt C++静态thread_local QNetworkAccessManager是线程应用程序的好选择吗
- C++多线程应用程序将永远挂起
- 为什么我的线程永远不会结束
- 更好的做法:永远循环线程或连续线程
- 无法永远分离线程 c++
- 如果迭代器的迭代器永远不会无效,则是STD :: MAP访问线程安全
- "永远"阻止线程的最简单便携式方法是什么?
- QnetworkAccessManager线程永远不会完成
- 多线程环境下,其他线程永远无法访问临界区
- 当其他线程正在等待读取时,写入串口将永远阻塞
- 创建boost线程时,Shared_ptr永远不会释放
- Winapi定时器回调线程,永远不会返回