Я пишу приложение для загрузки файла с помощью 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 секунд.
- Переключение с проводного на WiFi в течение 10-20 секунд и наоборот
Загрузка файлов зависает в вышеупомянутых сценариях. Хотя частота этой проблемы составляет один раз в 20 раз (5%). Чтобы смягчить это, я написал обходной код, чтобы проверять, работает ли сеть, используя TCP Socket, и опрашивать ее каждые 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;
}
Это работало хорошо до определенной степени. Но даже при этом, если в течение 30 секунд происходит «вытащить и вставить карту LAN», загрузка снова останавливается. Таким образом, этот обходной путь не мог полностью решить мою проблему. Опрос с очень коротким интервалом не выглядит правильным решением, так как для любого более короткого интервала времени может возникнуть состояние гонки.
Я застрял здесь, чтобы найти способ решить эту загрузку, застрявшую посередине. Может ли кто-нибудь из вас помочь найти способ мгновенного уведомления о загрузках при отключении сети?
Версия Qt, которую я использую, — 5.3.1, а Mac OS — 10.9.