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

ナビゲーションに移動 検索に移動
62行目: 62行目:
   
   
     return a.exec();
     return a.exec();
}
</syntaxhighlight>
<br>
以下の例では、ダウンロード処理を実行するために専用のスレッドを作成して、メインスレッドはタイマを使用して定期的にこのダウンロード処理をトリガしている。<br>
1分ごとにDownloader::downloadメソッドを呼び出し、ダウンロードが完了するとダウンロードしたコンテンツがコンソールに表示される。<br>
<br>
<u>※注意</u><br>
<u>実際の設計では、適切なエラーハンドリングとリソース管理 (例: QThread::quitとQThread::waitを実行してスレッドを適切に終了させる処理)が必要となる。</u><br>
<syntaxhighlight lang="c++">
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QThread>
#include <QTimer>
#include <QUrl>
#include <QObject>
class Downloader : public QObject {
    Q_OBJECT
private:
    QNetworkAccessManager m_Manager;
public:
    Downloader(QObject *parent = nullptr) : QObject(parent) {
      connect(&m_Manager, &QNetworkAccessManager::finished, this, &Downloader::onDownloadFinished);
    }
    void download(const QUrl &url) {
      QNetworkRequest request(url);
      m_Manager.get(request);
    }
signals:
    void downloadFinished(const QString &result);
private slots:
    void onDownloadFinished(QNetworkReply *reply) {
      if (reply->error()) {
          std::cerr << QString("Download error : %1").arg(reply->errorString()).toStdString() << std::endl;
          emit downloadFinished(reply->errorString());
      }
      else {
          QString data = reply->readAll();
          emit downloadFinished(data);
      }
      reply->deleteLater();
    }
};
int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);
    QThread downloaderThread;
    Downloader downloader;
    downloader.moveToThread(&downloaderThread);
    downloaderThread.start();
    QTimer timer;
    QObject::connect(&timer, &QTimer::timeout, [&downloader](){
      downloader.download(QUrl("http://www.google.com"));
    });
    QObject::connect(&downloader, &Downloader::downloadFinished, [](const QString &result){
      std::cout << QString("Downloaded content : %1").arg(result).toStdString() << std::endl;
    });
    // 1分ごとにダウンロード
    timer.start(60000);
    return app.exec();
  }
  }
  </syntaxhighlight>
  </syntaxhighlight>

案内メニュー