Главная arrow С++ (часть 2) arrow Как работает программа WinDL?

Как работает программа WinDL?

Программа WinDL обеспечивает визуальный интерфейс для класса Download, который поддерживает пользовательский ввод и отображает процесс загрузки Файла. WinDL сначала создает минимизированное (свернутое) главное окно, а затем отображает диалоговое окно загрузки. Таким образом, программа WinDL — приложение с диалоговым окном, никогда не отображающее глав-н°е окно. Как уже упоминалось, в задачу книги не входит описание тех фрагментов программы, которые используют базовые средства, общие для всех пРограмм, выполняющихся в системе Windows. Но те строки кода, которые косятся непосредственно к загрузчику, будут обсуждаться далее. ^Ункция DiaiogFuncO обеспечивает взаимодействие пользователя с диалоговым окном. В ней объявлены две статические переменные. Первая — Массив с именем uri, который выводится в поле редактирования по умолчанию. Вторая переменная — ti, представляющая собой маленькую струк. туру, которая содержит информацию, передаваемую потоковой функции. Во время создания диалогового окна инициализируются поле редактирован^ (edit box) и индикатор выполнения процесса (progress bar). Как написано в ком. ментариях, в поле редактирования выводится URL-адрес только для демонстрации (обычно этот элемент управления не содержит начальной строки) Приращение индикатора выполнения процесса задается равным 1. По умолчанию у таких элементов управления установлен диапазон изменения — от О до 100, таким образом, приращение, равное 1, означает прирост на 1%. Для загрузки файла из Интернета введите URL-адрес нужного файла в поле редактирования и щелкните кнопкой мыши по кнопке Start. Эти действия инициируют последовательность событий. Во-первых, индикатор выполнения процесса переустанавливается в 0. Далее программа получает из поля редактирования строку, содержащую URL-адрес, от переключателя (check box) — информацию о режиме загрузки (перезагрузка или дозагрузка), а от кнопки Start — ее дескриптор. Все эти данные запоминаются в структуре ti, которая передается в функцию потока. Затем счетчики выполнения процесса обнуляются. В программе есть глобальные переменные percentdone и oldpercentdone. Они используются для изменения текущей позиции в индикаторе выполнения процесса. Наконец, запускается новый поток, который будет выполнять загрузку.
Необходимо выполнять функцию downioado в собственном потоке, потому что система сообщений Windows предполагает, что управление будет ей возвращено относительно быстро (т. е. функция DiaiogFunc () не может совершать продолжительные действия, препятствующие обработке новых сообщений). Точка входа потока — функция dlstart о. Как объяснялось в главе 3, в системе Windows все потоковые функции принимают только один параметр типа void *. В нем можно передать любую информацию, необходимую функции. В данном случае он получает указатель на структуру ti, содержащую три поля: url, reload и hPBStart. На URL-адрес загрузки указывает поле url. Состояние переключателя Reload хранится в поле reload. Оно определяет, будет ли файл загружаться из Интернета целиком. Дескриптор кнопки Start содержится в поле hPBStart. Он используется функцией dlstart о для того, чтобы сделать кнопку Start недоступной, как только началась загрузка, и снова доступной после завершения загрузки. Функция dlstart о вызывает функцию downioado для выполнения загрузки файла из Интернета. При этом она передает в параметре update адрес функции showprogress о. Когда функция download о заканчивает работу, становится доступной кнопка Start и закрывается дескриптор потока. Функция showprogress о вызывается функцией downioado для отображения выполнения процесса загрузки. Она просто увеличивает полосу индикации каждый раз, когда загружен очередной процент объема файла.