QNetworkAccessManager 放到线程中使用finished信号不触发
2012-11-05 15:25
429 查看
使用QNetworkAccessManager进行数据下载时,由于是比较耗时的工作,所以需要丢到线程中去执行
直接上代码进行说明:
DownLoadThread::DownLoadThread(const QString & strTileUrl, const QString & strTileLocalPath)
{
m_bExit = false;
m_strTileUrl = strTileUrl;
m_strTileLocalPath = strTileLocalPath;
connect(&m_networkAccessManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(slotNetworkRequestFinished(QNetworkReply *)));
}
void DownLoadThread::run()
{
if (!QFile::exists(m_strTileLocalPath))
{
QNetworkRequest request(m_strTileUrl);
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork);
request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, true);
m_networkAccessManager.get(request);
}
}
QNetworkAccessManager m_networkAccessManager;
此种情况下finished信号永远不被触发,在线程外面调用则可正常触发使用,通过查资料终于弄明白,放在线程内使用QNetworkAccessManager时没有进行线程的事件循环,需要调用exec()才能开启线程的事件循环,因此解决方式为:m_networkAccessManager.get(request);后面加上exec(),使线程进行事件循环。
直接上代码进行说明:
DownLoadThread::DownLoadThread(const QString & strTileUrl, const QString & strTileLocalPath)
{
m_bExit = false;
m_strTileUrl = strTileUrl;
m_strTileLocalPath = strTileLocalPath;
connect(&m_networkAccessManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(slotNetworkRequestFinished(QNetworkReply *)));
}
void DownLoadThread::run()
{
if (!QFile::exists(m_strTileLocalPath))
{
QNetworkRequest request(m_strTileUrl);
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork);
request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, true);
m_networkAccessManager.get(request);
}
}
QNetworkAccessManager m_networkAccessManager;
此种情况下finished信号永远不被触发,在线程外面调用则可正常触发使用,通过查资料终于弄明白,放在线程内使用QNetworkAccessManager时没有进行线程的事件循环,需要调用exec()才能开启线程的事件循环,因此解决方式为:m_networkAccessManager.get(request);后面加上exec(),使线程进行事件循环。
相关文章推荐
- QNetworkAccessManager 放到线程中---finished信号不触发
- QNetworkAccessManager不使用信号/槽机制来获得QNetworkReply的解决办法
- Qt网络开发之QNetworkAccessManager使用要点
- QWebEngineView使用QNetworkAccessManager的QNetworkCookieJar
- QNetworkAccessManager的异步与线程
- QNetworkAccessManager 的使用
- 程序员一枚】Qt网络开发之QNetworkAccessManager的使用
- qt 的QNetworkAccessManager的使用和防止内存泄漏
- QNetworkAccessManager跳转URL处理(使用QNetworkRequest::RedirectionTargetAttribute获得跳转URL)
- QNetworkAccessManager的异步与线程
- 线程中通过信号和槽函数传递信息的时候,由于用到了自己定义的参数结构,所以使用qRegisterMetaType
- Qt 访问网络的 HttpClient(封装QNetworkAccessManager,且有服务端)
- CountDownLatch使用countDown方法来触发其他等待线程再执行的问题
- System.UnauthorizedAccessException: 拒绝访问 temp 目录。用来运行 XmlSerializer 的标识“NT AUTHORITY\NETWORK SERVICE”没有访问 temp 目录的足够权限。CodeDom 将使用进程正在使用的用户帐户进行编译,这样,如
- QNetworkAccessManager
- 线程互斥锁的问题(线程中使用定时器信号)
- Qt通过QNetworkAccessManager实现Http网络通信
- <h3>QT中使用QNetworkAccessManager类进行POST数据
- 关于Qt使用QNetworkAccessManager下载文件(实现断点续传功能)
- moveToThread的最简单用法(依葫芦画瓢即可)(使得线程也更偏向于信号槽的使用方法)