0

我每 X 秒建立一次连接。但如果网络带宽超载,定时器会在 QNetworkAccessManager 发送完成信号和应用程序崩溃之前触发。

主窗口::构造:

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

主窗口::连接()

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

MainWindow::result(QNetworkReply *reply) 处理响应

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

4

2 回答 2

3

不要为每个请求创建一个网络管理器,而只为您的班级创建一个网络管理器。否则,您会在每个请求中泄漏管理器,直到主窗口被销毁。

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

于 2012-11-20T23:45:10.400 回答
1

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

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()));
于 2012-11-21T11:44:54.037 回答