2015-09-23 3 views
1

Я разрабатываю программу обновления для моего приложения в Qt, прежде всего, чтобы узнать структуру (я понимаю, что есть несколько готовых решений, которые здесь не актуальны). Это основное приложение GUI, использующее подкласс QMainWindow для его главного окна и класс MyAppUpdater для выполнения реальной логики программы.Синхронная загрузка одного файла - это правильный подход в приложении GUI Qt?

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

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

Я думал об инициировании асинхронной загрузки, скажем, InitVersionInfoDownload, а затем подключения QNetworkReply'sfinished сигнала в слот под названием VersionInfoDownloadComplete, или что-то вдоль этих линий. Мне также нужен таймер для реализации проверок тайм-аута - если слот не вызывается после 3 секунд, обновление должно быть прервано. Однако этот подход представляется чрезмерно сложным и в целом неадекватным ситуации; Я не могу продолжить, не извлекая этот файл с сервера, или действительно ничего делать, ожидая его загрузки, поэтому асинхронный подход кажется вообще неприемлемым. Я ошибаюсь об этом, или есть лучший способ?

ответ

4

TL; Это неправильный подход в любой GUI-приложение.

как неудобно что-то подобное, чтобы реализовать в Qt

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

исходя из процедурного фона/C, я бы начать синхронную загрузку, установить тайм-аут может быть, 3 секунд, а затем посмотреть, что происходит

Если вы пишете какой-либо машины или интерфейса управления кода на C, вы, вероятно, не хотите, чтобы он был синхронным либо. Вы настроили конечный автомат и обработали все асинхронно. При кодировании встроенных приложений C государственные машины делают простые вещи абсолютно тривиальными. Есть несколько решений, QP/C будет примером первого класса.

был думать о инициировании асинхронной загрузки, скажем, InitVersionInfoDownload, а затем соединительной законченном сигнал QNetworkReply на слот под названием VersionInfoDownloadComplete, или что-то вдоль этих линий. Мне также нужен таймер для реализации проверок тайм-аута - если слот не вызывается после 3 секунд, обновление должно быть прервано. Однако этот подход представляется чрезмерно сложным

Это тривиально.Вы не можете обсуждать такие вещи, не показывая свой код: возможно, вы реализовали его каким-то ужасно подробным образом. Когда все сделано правильно, оно должно выглядеть худощавым и сладким. Для некоторого вдохновения см. this answer.

Я не могу обойтись без извлечения этого файла с сервера, или на самом деле делать что-либо во время ожидания для того, чтобы загрузить

Это явно ложное. Пользователь может пожелать отменить обновление и выйти из приложения или изменить его размер, или минимизировать/максимизировать его, или проверить существующую версию, или ОС может потребовать перерисовку окна, или ...

Помните: ваш пользователь и среда находятся под контролем. Приложение, не отвечающее дизайном, - это не только ужасный пользовательский опыт, но и делает ваш код более сложным для понимания и тестирования. Псевдосинхронные спагетти быстро выходят из-под контроля. С асинхронным дизайном тривиально использовать сигнальный шпион или другие продукты, чтобы понять, что делает приложение, где оно застряло и т. Д.

+0

Вы бы рекомендовали мне реализовать решение, которое я представил в вопросе, я беру его ? Обратите внимание, что я еще не закодировал его, поэтому вполне вероятно, что я просто преувеличивал его сложность. – szczurcio

+0

@szczurcio Да :) Почувствуйте grep мой [so github repo] (https://github.com/KubaO/stackoverflown) для 'QNetworkReply' и т. Д. –

+0

Хорошо, спасибо за ваш обнадеживающий пост :) – szczurcio