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 の特定の状況下では、ダウンロードがエラー コールバックなしで永続的に停止します。それらの状況は
- LAN(インターネット)ケーブルを抜いて、20秒以内に素早く差し込む
- 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 です。