2011-10-04 25 views
5

Im sử dụng QtSDK 4.7.3QNetworkReply phát ra tín hiệu báo lỗi hai lần khi ContentNotFoundError occures khi vòng lặp kiện này được bắt đầu vào khe lỗi

tôi đang làm điều này trong (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); 

Và tất tất nhiên, khe cắm onError được gọi là:

if (networkError == QNetworkReply::NetworkError::ContentNotFoundError) 
{ 
// Messagebox starts an event loop which 
// causes this slot to be called again 
QMessageBox m; 
m.exec(); 
} 

Nếu tôi không có hộp thư/eventloop trong khe onError không có sự cố và mọi thứ hoạt động. Nhưng khi nó ở đó thì khe onError được gọi lại khi m.exec() được gọi. Khi cả hai hộp thông báo đều bị đóng và tôi để lại hàm onError, ứng dụng gặp sự cố. Ứng dụng sẽ xóa/bộ nhớ trống khi điều này xảy ra. Lỗi "Truy cập vị trí đọc vi phạm" không giúp ích gì và ngăn xếp cuộc gọi nằm sâu trong các dll Qt.

Điều tôi đã kiểm tra:
Tín hiệu không được kết nối hai lần.
Kiểm tra cuộc gọi thử() trước và sau khi QApplication gọi hàm exec của nó. (không quan trọng).
Một lỗi khác như HostNotFound sẽ không gọi khe onError hai lần.
Tất cả mã của tôi được thực hiện trong chuỗi chính.
Đã cố gắng ngắt kết nối khe cắm onError để nó chỉ được gọi một lần nhưng nó vẫn bị treo.
Đã cố gắng hủy bỏ cuộc gọi theo yêu cầu trong onError().
Đã đăng câu hỏi tương tự trên diễn đàn Qt (post).

Có ai có thể giúp tôi tìm hiểu điều gì đang xảy ra ở đây không?

Đây là mã tôi sử dụng để thử nghiệm: main.cpp

#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; 

}; 

Trả lời

3

Có một lỗi trong Qt < 4.8.0: https://bugreports.qt.io/browse/QTBUG-16333

Sửa đổi kết nối với một hàng đợi đã giải quyết được vấn đề:

contentnotfound.h:

+0

Cảm ơn phản hồi rất nhanh của bạn. Những công việc này. Để làm rõ, trong giải pháp dòng này cũng được thêm vào: qRegisterMetaType ("QNetworkReply :: NetworkError"); Một giải pháp khác có thể được tìm thấy trong báo cáo lỗi mà bạn đã liên kết nhưng giải pháp này tốt hơn. Báo cáo lỗi cũng nói rằng với Qt 4.8.0 lỗi này sẽ được sửa. –

Các vấn đề liên quan