Dr Casper Black
Dr Casper Black

Reputation: 7478

Qtimer fires before QNetworkAccessManager finished

Im making a connection every X sec. but in case net bandwidth is overloaded timer fires before QNetworkAccessManager sends finished signal and app crashes.

MainWindow::construct:

pTimer = new QTimer(this);
connect(pTimer, SIGNAL(timeout()), this, SLOT(connect()));
pTimer->start(5000);

MainWindow::connect()

pNetworkManager = new QNetworkAccessManager(this);
connect(pNetworkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(result(QNetworkReply*)));
pNetworkManager->get(QNetworkRequest(url));

MainWindow::result(QNetworkReply *reply) processes the response

how to check if QNetworkAccessManager isFinished before timer fires again?

Upvotes: 0

Views: 657

Answers (2)

Kamil Klimek
Kamil Klimek

Reputation: 13130

Why not simply launch timer after request finished?

pTimer = new QTimer(this);
pTimer->setSingleshot(true);
connect(pTimer, SIGNAL(timeout()), this, SLOT(connect()));
pTimer->start(5000);

pNetworkManager = new QNetworkAccessManager(this);
connect(pNetworkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(result(QNetworkReply*)));
connect(pNetworkManager, SIGNAL(finished(QNetworkReply*)), pTimer, SLOT(start()));

Upvotes: 1

Frank Osterfeld
Frank Osterfeld

Reputation: 25155

Don't create a network manager per request, but only one network manager for your class. Otherwise you leak managers with each request until the mainwindow is destroyed.

QNetworkManager::get returns the pointer to the QNetworkReply representing the request. You can store that reply in a QPointer, connect to its signals, check QNetworkReply::isFinished() etc. to track whether the request is still running or not.

Upvotes: 3

Related Questions