「Qtの基礎 - ネットワーク」の版間の差分

ナビゲーションに移動 検索に移動
197行目: 197行目:
<br>
<br>
==== 同期的に取得 (タイムアウト設定あり) ====
==== 同期的に取得 (タイムアウト設定あり) ====
<code>QNetworkReply</code>クラスのオブジェクトに対して、<code>QNetworkAccessManager</code>クラスの<code>setTimeout</code>メソッドを使用する。<br>
以下の例では、<code>QNetworkAccessManager</code>クラスを使用してHTTPリクエストを送信して、レスポンスを待機している。<br>
<code>QEventLoop</code><code>QTimer</code>を使用して、レスポンスを受信する、または、3秒経過するまで待機する。<br>
3秒経過してもレスポンスを受信しない場合は、タイムアウトとして処理する。<br>
<br>
<br>
以下の例では、タイムアウトを3秒に設定しており、タイムアウト時には<code>QTimer</code>クラスを使用してタイムアウト処理を行っている。<br>
この方法により、非同期APIを使用しながらも同期的な振る舞いを実現することができる。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  #include <QNetworkAccessManager>
  #include <QNetworkAccessManager>
205行目: 207行目:
  #include <QNetworkReply>
  #include <QNetworkReply>
  #include <QTimer>
  #include <QTimer>
#include <QEventLoop>
   
   
  QNetworkAccessManager manager;
  QNetworkAccessManager manager;
QNetworkRequest request(QUrl("http://www.example.com"));
QNetworkReply *reply = manager.get(request);
   
   
  // タイムアウトを3秒に設定
  // イベントループを作成
  manager.setTransferTimeout(3000);
  QEventLoop loop;
   
   
  QNetworkReply *reply = manager.get(QNetworkRequest(QUrl("http://example.com")));
  // タイマオブジェクトを生成して、3秒後にタイムアウトするように設定
QTimer timer;
timer.setSingleShot(true);
   
   
  // タイムアウト用のタイマを設定
  // タイマのタイムアウトシグナルとイベントループのquitメソッドを接続
QTimer timeoutTimer;
  QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);
timeoutTimer.setSingleShot(true);
  QObject::connect(&timeoutTimer, &QTimer::timeout, [&](){reply->abort();});
timeoutTimer.start(3000); // タイムアウト時間を3秒に設定
   
   
  // レスポンス待機
  // レスポンスが完了したらイベントループを終了するように接続
QEventLoop loop;
  QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
// タイマを開始 (3秒後にタイムアウト)
timer.start(3000);
// イベントループを開始 (リクエストが完了する、または、タイムアウトするまで待機)
  loop.exec();
  loop.exec();
   
   
  if (reply->error() == QNetworkReply::NoError) {
  if (timer.isActive()) {
    qDebug() << "Response:" << reply->readAll();
    // タイマがアクティブな場合、リクエストが成功しているとする
    timer.stop(); // タイマを停止
    if (reply->error() == QNetworkReply::NoError) {
      QByteArray responseData = reply->readAll();
      std::cout << QString("Response received : %1").arg(responseData).toStdString() << std::endl;
    }
    else {
      std::cout << QString("エラー : %1").arg(reply->errorString()).toStdString() << std::endl;
    }
  }
  }
  else {
  else {
     qDebug() << "Error:" << reply->errorString();
     // タイマが非アクティブな場合、タイムアウトが発生しているものとする
    std::cout << QString("エラー : タイムアウト").toStdString() << std::endl;
  }
  }
   
   

案内メニュー