13,005
回編集
197行目: | 197行目: | ||
<br> | <br> | ||
==== 同期的に取得 (タイムアウト設定あり) ==== | ==== 同期的に取得 (タイムアウト設定あり) ==== | ||
<code> | 以下の例では、<code>QNetworkAccessManager</code>クラスを使用してHTTPリクエストを送信して、レスポンスを待機している。<br> | ||
<code>QEventLoop</code>と<code>QTimer</code>を使用して、レスポンスを受信する、または、3秒経過するまで待機する。<br> | |||
3秒経過してもレスポンスを受信しない場合は、タイムアウトとして処理する。<br> | |||
<br> | <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); | |||
// | // イベントループを作成 | ||
QEventLoop loop; | |||
// タイマオブジェクトを生成して、3秒後にタイムアウトするように設定 | |||
QTimer timer; | |||
timer.setSingleShot(true); | |||
// | // タイマのタイムアウトシグナルとイベントループのquitメソッドを接続 | ||
QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); | |||
QObject::connect(& | |||
// | // レスポンスが完了したらイベントループを終了するように接続 | ||
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()) { | ||
// タイマがアクティブな場合、リクエストが成功しているとする | |||
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 { | ||
// タイマが非アクティブな場合、タイムアウトが発生しているものとする | |||
std::cout << QString("エラー : タイムアウト").toStdString() << std::endl; | |||
} | } | ||