QNetworkReply
のタイムアウトを設定することは可能ですか?長い間、サーバーからの応答がないので、finished()
信号を送信できますか?外部タイマーなしでQNetworkReplyタイムアウトを設定するには?
3
A
答えて
3
タイマーを使用しないとできませんが、明示的にタイマーコードを書く必要はありません。この機能は、タイムアウトが応答の設定可能なプロパティであるかのように動作する静的関数にきれいにパッケージ化できます。以下の例を参照してください。
二つの問題があります。進行中のリクエストに応じてタイムアウトを処理する方法を
が。
ネットワーク要求が処理を開始したかどうかを判断する方法。この問題はthis questionで解決されています。
単純なタイムアウトハンドラは、(this answer由来)、以下のように実施することができます。コードはQt 4とQt 5で移植可能です。
abort
-ingタイムアウト(デフォルト)の要求、またはclose
-ingの間で選択できます。前者はネットワークリソースをただちに解放します。後者は要求を完了させますが、受信したすべてのデータを破棄し、アップロード要求ではほとんど役に立ちます。
class ReplyTimeout : public QObject {
Q_OBJECT
QBasicTimer m_timer;
HandleMethod m_method;
public:
enum HandleMethod { Abort, Close };
QReplyTimeout(QNetworkReply* reply, const int timeout, HandleMethod method = Abort) :
QObject(reply), m_method(method)
{
Q_ASSERT(reply);
if (reply && reply->isRunning()) {
m_timer.start(timeout, this);
connect(reply, &QNetworkReply::finished, this, &QObject::deleteLater);
}
static void set(QNetworkReply* reply, const int timeout, HandleMethod method = Abort) {
new ReplyTimeout(reply, timeout, method);
}
protected:
void timerEvent(QTimerEvent * ev) {
if (!m_timer.isActive() || ev->timerId() != m_timer.timerId())
return;
auto reply = static_cast<QNetworkReply*>(parent());
if (reply->isRunning()) {
if (m_method == Close)
reply->close();
else if (m_method == Abort)
reply->abort();
m_timer.stop();
}
};
用途:
QNetworkAccessManager networkAccessManger;
QNetworkReply* reply =
networkAccessManger.get(QNetworkRequest(QUrl("https://www.google.com")));
ReplyTimeout::set(reply, 100);
関連する問題
- 1. erlangタイマーがタイムアウトになる
- 2. タイマーの外部にある
- 3. LIBGDXでタイマーを設定するには
- 4. Asp.net MVCで外部設定ファイルを設定するには?
- 5. C#でタイムアウトを設定するには
- 6. recvmmsg()でタイムアウトを設定するには?
- 7. メカニカルルビーでタイムアウトを設定するには?
- 8. URL.openStream()でタイムアウトを設定するには
- 9. MVCはドロップダウンなしで外部キーを設定しました
- 10. 外部設定
- 11. mysqlにタイマーを設定し、タイマーを00:00:00に設定した後にフィールドを更新する方法は?
- 12. httpリクエストでQNetworkReplyとQNetworkAccessManagerのタイムアウトが発生する
- 13. テーブルで外部キーを設定する
- 14. CLGeocoderタイムアウトを設定するには?
- 15. Socket.ConnectAsyncのタイムアウトを設定するには?
- 16. 実際に外部キーではない特定の列に対して外部キーを作成しないようにEF codefirstを設定するには
- 17. タイムアウトでタイマーを作成する方法
- 18. 外部サイトにクッキーを設定してワードプレスで使用する
- 19. Cakephp 3.3で外部キー制約を設定するには?
- 20. CMakeで外部のINTERFACE_SOURCESのコンパイルフラグを設定するには?
- 21. オートマトンのドメインに存在しない外部データを設定するには
- 22. STM32F051タイマー設定
- 23. タイマーにコールバック関数を設定する
- 24. Doctrine:外部関係を設定する
- 25. UIルータ - 外部ログインページを設定する
- 26. tomcat localhost_access_logを外部設定する
- 27. C#外部キーを設定する
- 28. 設定可能な外部URL
- 29. .Netタイムアウト:WaitForSingleObjectとタイマー
- 30. Apache Sparkに外部パッケージを設定するには?
単純な答え:いいえ。 –