13,008
回編集
(→概要) |
|||
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> |