当事件循环在错误槽启动时,ContentNotFoundError发生时,QNetworkReply发出两次错误信号
QNetworkReply emits error signal twice when ContentNotFoundError occures when event loop is started in error slot
我使用的是QtSDK 4.7.3
我在(void test())中做这个:
mgr = new QNetworkAccessManager();
reply = mgr->get(QNetworkRequest(QUrl("http://developer.qt.nokia.com/fileNotExisting.txt")));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
SLOT(onError(QNetworkReply::NetworkError)), Qt::ConnectionType::UniqueConnection);
当然槽onError被称为
if (networkError == QNetworkReply::NetworkError::ContentNotFoundError)
{
// Messagebox starts an event loop which
// causes this slot to be called again
QMessageBox m;
m.exec();
}
如果我没有一个消息框/事件循环在onError槽没有崩溃和一切工作。但是当它在那里时,onError槽在调用m.exec()时再次被调用。当两个消息框都关闭并且我留下onError函数时,应用程序崩溃。当发生这种情况时,应用程序尝试删除/释放内存。错误"访问冲突读取位置"没有任何帮助,调用堆栈深入Qt dll。
我检查了什么:
信号没有连接两次。
尝试在QApplication调用exec函数之前和之后调用test()。(没关系)。
另一个错误,如HostNotFound将不会调用onError槽两次。
我所有的代码都在主线程中执行。
尝试断开onError插槽,所以它只被调用一次,但它仍然崩溃。
尝试在onError()中对请求调用abort。
在Qt论坛(post)上发布了同样的问题。
#include "contentnotfound.h"
#include <QtGui/QApplication>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ContentNotFound cnf;
// false: start test after application's event loop have started
if (true) { cnf.test(); }
else { QTimer::singleShot(2000, &cnf, SLOT(test())); }
return a.exec();
}
contentnotfound.h
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QMessageBox>
class ContentNotFound : public QObject
{
Q_OBJECT
public slots:
void test()
{
mgr = new QNetworkAccessManager();
reply = mgr->get(QNetworkRequest(QUrl("http://developer.qt.nokia.com/fileNotExisting.txt")));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
SLOT(onError(QNetworkReply::NetworkError)), Qt::ConnectionType::UniqueConnection);
}
private slots:
void onError(QNetworkReply::NetworkError networkError)
{
//reply->disconnect(); // Disconnect all signals
if (networkError == QNetworkReply::NetworkError::ContentNotFoundError)
{
// Messagebox starts an event loop which
// causes this slot to be called again
QMessageBox m;
m.exec();
}
}
private:
QNetworkAccessManager* mgr;
QNetworkReply* reply;
};
Qt <4.8.0: https://bugreports.qt.io/browse/qtbug - 16333
修改一个排队的连接解决了这个问题:
contentnotfound.h:
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QMessageBox>
class ContentNotFound : public QObject
{
Q_OBJECT
public slots:
void test()
{
qRegisterMetaType<QNetworkReply::NetworkError>("QNetworkReply::NetworkError");
mgr = new QNetworkAccessManager(this);
reply = mgr->get(QNetworkRequest(QUrl("http://developer.qt.nokia.com/fileNotExisting.txt")));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
SLOT(onError(QNetworkReply::NetworkError)), Qt::QueuedConnection);
}
private slots:
void onError(QNetworkReply::NetworkError networkError)
{
//reply->disconnect(); // Disconnect all signals
if (networkError == QNetworkReply::ContentNotFoundError)
{
// Messagebox starts an event loop which
// causes this slot to be called again
QMessageBox m;
m.exec();
}
}
private:
QNetworkAccessManager* mgr;
QNetworkReply* reply;
};
相关文章:
- 在条件变量中触发错误信号的频率是多少
- 运行时错误地址清理器:LEETCODE 中的致命信号
- C++ - 程序接收信号SIGSEGV,分段错误.In msvcrt!memcpy () (C:\Windows\S
- 当我使用Connect信号和插槽时,会出现此分解错误
- 信号:使用 Openmpi 时出现分段错误 (11)
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- 信号:分段错误 (11) 信号代码:权限无效 (2)
- 发生 Qt5.11 应用插件构建错误:信号和插槽参数不兼容
- sqlite3 程序接收信号 SIGSEGV,分段错误在 sqlite3_get_table ()
- GTK+3 编译错误"找不到信号处理程序",您是否使用 -rdynamic 进行了编译?
- QT信号和插槽无法提供错误消息
- 如何使用新的QObject::连接语法与函数指针将QSslSocket::错误信号连接到插槽
- Qt 错误:信号 QDeclarativeEngine::quit() 发出,但没有连接接收器来处理它
- 如何克服运行时错误信号:25?等效地,浮点错误:核心转储
- 打开时的QSerialPort错误信号,但打开返回true
- 简单C++代码上的运行时错误信号11
- QTcpSocket不发出错误信号
- 当事件循环在错误槽启动时,ContentNotFoundError发生时,QNetworkReply发出两次错误信号
- 在递归函数中被SIGSEGV(地址边界错误)信号终止
- 分段故障错误(信号名称:SIGSEGV)的原因是什么,以及如何查找/修复它