Пример: Adobe PageMaker
Рассмотрим использование потоков на примере приложения Adobe PageMaker, работающего под управлением операционной системы Linux. Программа PageMaker является настольным издательским средством, предназначенным для создания и форматирования документов. Для оптимизации скорости отклика этого приложения была выбрана потоковая структура, показанная на рис. 4.5 [KRON90]. Три потока активны всегда — поток, отвечающий за обработку событий, поток, обновляющий экран, и служебный поток.
Операции, на которые требуется много времени (печать, импорт данных и заливка), выполняются в служебном потоке программы PageMaker, чтобы не блокировать этими операциями возможность обработки поступающих сообщений. В этом же потоке происходит большая часть инициализации программы, что позволяет избежать простоя, который мог бы возникнуть при создании нового документа или открытии уже существующего. Отдельный поток служит для обработки сообщений о новых событиях.
Синхронизация служебного потока и потока обработки событий является непростой задачей. Пользователь может продолжать набирать текст или работать с мышью, активизируя тем самым поток обработки событий, в то время как служебный поток будет все еще занят. При возникновении подобного конфликта PageMaker фильтрует сообщения и воспринимает только основные из них, такие, как запрос на изменение размера окна.
О завершении выполнения задания свидетельствует сообщение, поступающее из служебного потока. Пока это сообщение не будет получено, возможности пользователя в программе PageMaker ограничены. Об этом свидетельствует отключение пунктов меню и специальный вид курсора. Пользователь может активизировать окна других приложений; когда курсор перемещается в другое окно, он приобретает вид, соответствующий приложению этого окна.
Для обновления экрана используется отдельный поток, что вызвано следующими причинами.
1. В программе PageMaker количество объектов на странице не ограничено, и поэтому обработка запроса на обновление экрана может оказаться весьма длительной.
2. Использование отдельного потока позволяет пользователю в любой момент остановить вывод изображения на экран. При такой методике, например, может немедленно выполняться команда изменения масштаба. Если бы программа должна была сначала закончить вывод страницы в старом масштабе, а затем полностью вывести ее в новом масштабе, это резко увеличило бы время ее отклика.
Возможна также динамическая прокрутка, т.е. обновление экрана при перетаскивании пользователем ползунка прокрутки. Поток обработки событий отслеживает положение ползунка и перерисовывает размещенные вдоль полей линейки (которые перерисовываются очень быстро, позволяя пользователю сориентироваться в текущем положении документа). В это время поток обновления экрана постоянно пытается перерисовать смещающуюся страницу, отслеживая изменение ее положения.
Реализация динамического обновления экрана без использования потоков привела бы к перегрузке приложения, так как ему приходилось бы согласовывать свои действия в разных частях кода с помощью обмена сообщениями. Многопоточность позволяет более естественно реализовать код, в котором предполагается параллельное выполнение различных действий.
Дата добавления: 2016-06-05; просмотров: 1969;