3

Qtを使用してファイルをダウンロードするアプリケーションを作成しています。コードスニペットは

QNetworkAccessManager nam = new QNetworkAccessManager();

QNetworkRequest request;
request.setUrl(kUrl);

QNetworkReply reply;
//connect error(), finished(), downloadProgress(b,t) signal of reply object
reply = nam.get(request);

正常に動作しますが、Mac の特定の状況下では、ダウンロードがエラー コールバックなしで永続的に停止します。それらの状況は

  1. LAN(インターネット)ケーブルを抜いて、20秒以内に素早く差し込む
  2. 10 ~ 20 秒以内に有線から WiFi に切り替え、その逆も可能

上記のシナリオでは、ファイルのダウンロードが停止します。ただし、この問題の頻度は 20 回に 1 回 (5%) です。これを軽減するために、TCP ソケットを使用してネットワークが稼働しているか停止しているかを確認し、30 秒ごとにポーリングする回避策のコードを作成しました。

bool check()
{
std::auto_ptr<QTcpSocket> sock(new QTcpSocket);
sock->connectToHost(kHostname, kConnectPort);
bool connected = sock->waitForConnected(30000);

if (!connected)
{
    sock->abort();
    return false;
}
sock->close();
return true;
}               

ある程度はうまくいきました。ただし、これでも「LAN カードの抜き差し」が 30 秒以内に発生すると、ダウンロードが再びスタックします。したがって、この回避策では問題を完全に解決できませんでした。非常に短い間隔でのポーリングは、適切な解決策のようには見えません。間隔が短いと、競合状態が発生する可能性があります。

私は、途中で詰まったこのダウンロードを解決する方法を見つけるのにここで立ち往生しています。ネットワークがオフになったときにダウンロードを即座に通知する方法を考え出すのを手伝ってくれる人はいますか?

私が使用している Qt のバージョンは 5.3.1 で、Mac OS は 10.9 です。

4

2 に答える 2

1

QNetworkSession クラスを見てみましょう: http://doc.qt.digia.com/qtmobility/qnetworksession.html#State-enum

void QNetworkSession::stateChanged ( QNetworkSession::State 状態 ) [シグナル]

このシグナルは、ネットワーク セッションの状態が変化するたびに送信されます。state パラメータは新しい状態です。

例:

// Set Internet Access Point
QNetworkConfigurationManager manager;

// Is there default access point, use it
QNetworkConfiguration cfg = manager.defaultConfiguration();

// Open session
m_session = new QNetworkSession(cfg);
connect(m_session, SIGNAL(closed()), this, SLOT(closed()));
connect(m_session, SIGNAL(stateChanged(QNetworkSession::State)), this, SLOT(stateChanged(QNetworkSession::State)));
connect(m_session, SIGNAL(error(QNetworkSession::SessionError)), this, SLOT(error(QNetworkSession::SessionError)));
m_session->open();
// Waits for session to be open and continues after that
m_session->waitForOpened();
于 2014-07-30T10:50:07.510 に答える
0

QNetworkConfigurationManager::onlineStateChanged(bool isOnline)シグナルを使用して、ネットワークに接続しているかどうかを追跡できます。

于 2016-03-12T10:30:22.470 に答える