QNetworkReply 在发出完成信号时抛出 SIGSEGV
QNetworkReply throwing SIGSEGV when finished signal emitted
我的应用程序使用 QNetworkReply
从 RESTful API 发送和接收数据。
有很多教程可以使用 QNetworkReply with QNetworkAccessManager
一旦找到我使用的这样的例子here or even here
基本用法:
// Header
QNetworkAccessManager *manager;
QNetworkReply *myReply;
QMetaObject::Connection conReply;
// 发出请求
void MainWindow::makeRequest(QString url) {
//...
QNetworkRequest request(QUrl(url));
myReply = manager->get(request) // or post(request)
conReply = QObject::connect(myReply, SIGNAL(finished()), this, SLOT(myReplyResponse()));
}
// 处理请求
void MainWindow::myReplyResponse(){
QObject::disconnect(conReply);
QByteArray data = myReply->readAll();
// or QByteArray data = myReply->read(myReply->bytesAvailable());
myReply->deleteLater();
// do something with this data
//...
}
使用类似的实现,我每 X 秒请求一次数据。
问题:
当接收到finished()
信号时,处理回复的代码被触发,但是当读取数据时,我得到一个SIGSEGV
。
这个问题似乎是随机发生的,因此我无法确定是什么触发了它。
我们很乐意接受任何建议。
可能发生的情况是它正在延迟订单,假设每秒发送一个订单但复制需要 2 秒,2 秒后您阅读了回复并将其从内存中删除,当另一个出现时,myReply 是一个空指针。您必须做的是使用 sender()
获取副本,并且始终建议验证您没有空指针:
*.h
private:
QNetworkAccessManager *manager;
*.cpp
[...]
manager = new QNetworkAccessManager(this);
[...]
void MainWindow::makeRequest(const QString &url)
{
Qurl mUrl(url);
QNetworkRequest request(mUrl);
QNetworkReply *myReply = manager->get(request); // or post(request)
connect(myReply, &QNetworkReply::finished, this, &MainWindow::myReplyResponse);
}
void MainWindow::myReplyResponse()
{
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
if(reply){
QByteArray data = reply->readAll();
qDebug()<<data;
reply->deleteLater();
}
}
我的应用程序使用 QNetworkReply
从 RESTful API 发送和接收数据。
有很多教程可以使用 QNetworkReply with QNetworkAccessManager
一旦找到我使用的这样的例子here or even here
基本用法:
// Header
QNetworkAccessManager *manager;
QNetworkReply *myReply;
QMetaObject::Connection conReply;
// 发出请求
void MainWindow::makeRequest(QString url) {
//...
QNetworkRequest request(QUrl(url));
myReply = manager->get(request) // or post(request)
conReply = QObject::connect(myReply, SIGNAL(finished()), this, SLOT(myReplyResponse()));
}
// 处理请求
void MainWindow::myReplyResponse(){
QObject::disconnect(conReply);
QByteArray data = myReply->readAll();
// or QByteArray data = myReply->read(myReply->bytesAvailable());
myReply->deleteLater();
// do something with this data
//...
}
使用类似的实现,我每 X 秒请求一次数据。
问题:
当接收到finished()
信号时,处理回复的代码被触发,但是当读取数据时,我得到一个SIGSEGV
。
这个问题似乎是随机发生的,因此我无法确定是什么触发了它。
我们很乐意接受任何建议。
可能发生的情况是它正在延迟订单,假设每秒发送一个订单但复制需要 2 秒,2 秒后您阅读了回复并将其从内存中删除,当另一个出现时,myReply 是一个空指针。您必须做的是使用 sender()
获取副本,并且始终建议验证您没有空指针:
*.h
private:
QNetworkAccessManager *manager;
*.cpp
[...]
manager = new QNetworkAccessManager(this);
[...]
void MainWindow::makeRequest(const QString &url)
{
Qurl mUrl(url);
QNetworkRequest request(mUrl);
QNetworkReply *myReply = manager->get(request); // or post(request)
connect(myReply, &QNetworkReply::finished, this, &MainWindow::myReplyResponse);
}
void MainWindow::myReplyResponse()
{
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
if(reply){
QByteArray data = reply->readAll();
qDebug()<<data;
reply->deleteLater();
}
}