Qtimer在QNetworkAccessManager完成之前启动

Qtimer fires before QNetworkAccessManager finished

本文关键字:启动 QNetworkAccessManager Qtimer      更新时间:2023-10-16

我每X秒进行一次连接。但如果网络带宽过载,在QNetworkAccessManager发送完成信号和应用程序崩溃之前,计时器会启动。

主窗口::构造:

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

主窗口::connect()

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

MainWindow::result(QNetworkReply*回复)处理响应

如何在计时器再次启动之前检查QNetworkAccessManager是否已完成?

不要为每个请求创建一个网络管理器,而只能为您的类创建一个。否则,每次请求都会泄漏管理器,直到主窗口被破坏。

QNetworkManager::get返回指向代表请求的QNetworkReply的指针。您可以将该回复存储在QPointer中,连接到其信号,检查QNetworkReply::isFinished()等以跟踪请求是否仍在运行。

为什么不简单地在请求完成后启动计时器?

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()));