0

X秒ごとに接続しています。ただし、ネット帯域幅が過負荷の場合、QNetworkAccessManagerが終了信号を送信してアプリがクラッシュする前にタイマーが起動します。

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)は応答を処理します

タイマーが再度起動する前にQNetworkAccessManagerがFinishedかどうかを確認する方法は?

4

2 に答える 2

3

要求ごとにネットワーク マネージャーを作成しないでください。クラスにはネットワーク マネージャーを 1 つだけ作成してください。そうしないと、メインウィンドウが破棄されるまで、リクエストごとにマネージャーがリークされます。

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 に答える