C ++ / Qt скачать файл в синхронизации - PullRequest
1 голос
/ 02 ноября 2009

Я хочу добиться, чтобы загрузить файл в отдельном потоке и сохранить этот файл, но я не смог найти подходящий способ добиться этого без злых задержек (довольно частая загрузка небольших файлов, поэтому слоты signal + слишком медленные). Чего я хочу добиться: (Псевдокод)

request file;
wait for download finishing, timeout or error;
save downloaded file;

Я бы предпочел пример с QNetworkAccessManager, если это возможно. Спасибо за любой отзыв.

Изменить: Просто чтобы прояснить, я хочу, чтобы сигнал и слоты не из-за дизайна, а из-за отсутствия скорости.

Edit2: эта загрузка относится только к загрузке файла в части синхронизации, потоков не является проблемой. Проблема в том, что QT не предоставляет API для этого, и я не заинтересован в ожидании горячей прокрутки.

Edit3: пример кода, который должен работать, но не работает:

QNetworkAccessManager net;
QNetworkReply *re (net.get( QNetworkRequest( QUrl( Qstring("www.blah.org/key") ) ) ));
if (re->waitForReadyRead(-1)) //! @bug this does not work as supposed, waitForRead returns false and returns INSTANTLY!!
    qDebug() << "ReadyRead yeha!!!";
if (re->error()) {
    qDebug() << "Can't download" << re->url().toString()
            << ":" << re->errorString();
} else {
    img->load(re->readAll());
    qDebug() << "Savin IMG";
}
delete re;

Ответы [ 2 ]

1 голос
/ 03 ноября 2009

Мне нужно что-то подобное, но по разным причинам. Поскольку QHttp и QNetworkAccessManager являются асинхронными, вы можете использовать отдельный цикл обработки событий, полный пример, основанный на QHttp, можно найти здесь . Не должно быть слишком сложно изменить его для QNetworkAccessManager.

Стоит отметить, что ваше впечатление, что сигналы / слоты "медленные", вероятно, ошибочно. Вы действительно профилировали свой код, чтобы определить это?

Какой бы штраф вы не платили за сигналы / слоты, он, вероятно, незначителен, если посмотреть на количество времени, которое занимает загрузка одного файла. Более того, это очень "не Qt", чтобы делать вещи таким образом. Эти классы были разработаны так по определенной причине.

В конце дня если вы действительно страдаете от сигналов / слотов (что опять-таки сомнительно), я бы порекомендовал не использовать Qt для этой конкретной задачи, может быть, простые старые сокеты C лучшая идея (или тонкая оболочка вокруг них, чтобы сохранить обработку ошибок, которая может потребовать дополнительной работы).

0 голосов
/ 22 декабря 2010

Синхронизация доступа к сети - плохая идея, потому что она плохо работает с пользовательским интерфейсом. Кроме того, что вы думаете, это ошибка, это не ошибка. Это просто неправильно задокументировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...