русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Передача управления


Дата добавления: 2013-12-23; просмотров: 936; Нарушение авторских прав


.

.

.

Создание цикла обработки очереди сообщений

Отображение и обновление окна.

Хотя функция CreateWindow() и создает окно, это не значит, что оно будет автоматически отображаться на экране дисплея. Для отображения окна следует воспользоваться функцией ShowWindow(), а для обновления окна функцией UpdateWindow(). Эти функции вызываются, как правило, сразу же после создания окна функцией CreateWindow():

 

ShowWindow (hWnd, nCmdShow) ; // Отображение окна

UpdateWindow (hWnd) ; // Обновление окна

Функция ShowWindow() отображает окно, дескриптор которого передается ей в качестве первого параметра (практически для всех функций работы с окнами первым параметром должен быть указан дескриптор окна). Второй передаваемый параметр определяет, как отображается окно - в виде пиктограммы или полностью. Если параметр nCmdShow равен SW_SHOWNORMAL, то окно отображается открытым, а если он равен SW_SHOWMINNOACTIVE, то окно отображается в виде пиктограммы.

Функция UpdateWindow() передает функции окна, заданного параметром hWnd, сообщение WM_PAINT. Получив это сообщение, функция окна обновляет содержимое окна.

 

Таким образом, для отображения окна на экране необходимо:

· Зарегистрировать класс окна функцией RegisterClass().

· Создать окно функцией CreateWindow().

· Отобразить окно функцией ShowWindow().

· Обновить окно функцией UpdateWindow().

Такое разделение на ряд этапов имеет большое значение.

Во-первых, зарегистрировав класс окна, программа может создавать не одно, а несколько окон, несколько копий.

Во-вторых, порядок и место вызова функций ShowWindow() и UpdateWindow() не является обязательным. Окно может быть отображено не в момент создания, а позже.

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



Простейшая петля обработки очереди сообщений состоит из функций GetMessage() и DispatchMessage():

 

MSG Msg;

while (GetMessage (&Msg, NULL, NULL, NULL))

DispatchMessage (&Msg);

Функция GetMessage() извлекает сообщение из очереди приложения, помещая его в структуру Msg. Указание вторым аргументом NULL говорит о том, что следует обрабатывать все сообщения. Каждое получаемое приложением сообщение (за исключением WM_QUIT) принадлежит одному из окон приложения.

Поскольку приложение не должно прямо вызывать функцию обработки окна, для передачи сообщения нужному окну используется специальная функция DispatchMessage(), которая указывает Windows, что данное сообщение должно быть передано соответствующей функции окна. При этом принадлежность сообщения данному окну отслеживается и поддерживается Windows автоматически.

В зависимости от того, какие функции будет выполнять ваше приложение, цикл обработки очереди сообщений может усложниться. Перед функцией DispatchMessage() могут быть помещены специальные функции, производящие над помещенными в очередь сообщениями какие-то действия. Например, при помощи функции TranslateMessage() можно привести все сообщения, пришедшие с клавиатуры, к стандарту ANSI. Работая с очередью приложения, можно назначать на те или иные действия (команды) приложения произвольные комбинации клавиш.

 

В очередь приложения помещаются сообщения, возникающие при:

· перемещении курсора мыши в окне;

· нажатии или опускании клавиши мыши тогда, когда курсор мыши находится в окне;

· нажатии или опускании клавиши на клавиатуре тогда, когда данное окно активно.

 

Администратор окон сначала помещает все сообщения в системную очередь, а затем копирует нужные сообщения в очередь соответствующего приложения.

Когда функция GetMessage() возвращает NULL, извлекая из очереди приложения сообщение WM_QUIT, происходит выход из цикла обработки очереди сообщений. Сообщение WM_QUIT, таким образом, является средством завершения работы приложения. Оно обычно помещается в очередь приложения одной функцией главного окна данного приложения.

 

Передав управление приложению, Windows не может забрать управление обратно и ждет, пока приложение не освободит процессор. Таким образом, в Windows возможен захват процессора неправильно работающим приложением и вызванное этим «зависание» системы.

Для того чтобы обеспечить более равномерное разделение вычислительных ресурсов процессора между приложениями, при отсутствии сообщений в очереди приложения функция GetMessage() автоматически передает управление Windows. Таким образом, если приложение в данный момент времени не задействовано, Windows может передать управление другому приложению. Поскольку все приложения имеют цикл обработки очередей сообщений, такая неявная передача управления в какой-то степени обеспечивает разделение вычислительных ресурсов процессора. В большинстве случаев механизм передачи управления функции GetMessage() вполне удовлетворительно разделяет время процессора. Однако, если ваше приложение, например, пишет на диск большие объемы данных или производит большую вычислительную работу, другие задачи не будут работать, пока ваше приложение не передаст управление Windows.

В WIN32 проблемы захвата процессора приложением не возникает, так как WIN32 работает с приложениями в режиме разделения времени. В этом режиме работы каждое приложение обрабатывается установленный квант времени после чего запоминаются состояния регистров и WIN32 переходит к обработке очередного приложения в течении того же кванта времени. Такой процесс продолжается все время циклически. Переходя к обработке очередного приложения WIN32 восстанавливает состояние регистров и продолжает работу с приложением с прерванной точки.



<== предыдущая лекция | следующая лекция ==>
Создание окна | Сообщение WM_DESTROY


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.005 сек.