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

ナビゲーションに移動 検索に移動
1行目: 1行目:
== 概要 ==
== 概要 ==
<br><br>
== HTTPリクエスト / HTTPレスポンス (非同期) ==
==== 一定のタイミングで取得 ====
# ネットワークアクセスマネージャの設定
#: <code>QNetworkAccessManager</code>クラスを使用して、HTTPリクエストを送信して、HTTPレスポンスを受信する。
#: <code>QNetworkAccessManager</code>クラスは非同期で動作し、<code>QNetworkReply</code>クラスのオブジェクトを通じて結果を返す。
# タイマの設定
#: <code>QTimer</code>クラスを使用して、指定した間隔ごとにスロット(関数)を実行する。
#: このスロット内でHTTPリクエストを発行する。
# マルチスレッドの実装
#: Qtのマルチスレッド処理の方法はいくつか存在する。
#: しかし、<code>QNetworkAccessManager</code>クラス自身は非同期処理を行うため、マルチスレッドを明示的に扱う必要はない。
#: もし、ダウンロード処理のみを別のスレッドで行う場合は、<code>QThread</code>クラスまたは<code>QtConcurrent</code>クラスを使用して、その中で<code>QNetworkAccessManager</code>クラスのオブジェクトを作成および使用する。
<syntaxhighlight lang="c++">
#include <QCoreApplication>
#include <QTimer>
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QObject>
class Downloader : public QObject {
    Q_OBJECT
private:
    QNetworkAccessManager m_Manager;
    QTimer m_Timer;
public:
    Downloader() {
      connect(&m_Timer, &QTimer::timeout, this, &Downloader::startDownload);
      connect(&m_Manager, &QNetworkAccessManager::finished, this, &Downloader::downloadFinished);
      m_Timer.start(60000);  // 1分ごと
    }
private slots:
    void startDownload() {
        QUrl url("https://www.google.com");
        QNetworkRequest request(url);
        m_Manager.get(request);
    }
    void downloadFinished(QNetworkReply *reply) {
      if (reply->error()) {
          qDebug() << "Download error:" << reply->errorString();
          return;
      }
      QString data = reply->readAll();
      qDebug() << data;
    }
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Downloader downloader;
    return a.exec();
}
</syntaxhighlight>
<br><br>
<br><br>


案内メニュー