Шаг 180 - Функциональное и событийное программирование

При программировании в Windows очень важно понимать разницу между обычным программированием и событийным. Давайте посмотрим, что представляет из себя программирование скажем на C в ДОС все начинается с main, потом идет вызов ряда функций

 main()
 {
 f1();
 f2();
 }

Эти функции в свою очередь вызывают другие и так далее. Для организации реакции на действия пользователя приходилось делать бесконечные циклы типа

 while (TestKey());

При этом выполнение программы останавливалось. Был и другой подход основанный на обработке прерываний. Вот это и был подход основанный на событиях. Необходимо было перехватить прерывание и тогда при его появлении управление сразу передавалось на необходимую функцию не пробегая полностью по дереву вызовов. Правда количество прерываний было ограничено.

Итак, есть два способа создания программ. Первый в виде дерева вызовов, второй это реакции на события. Вы легко можете заметить разницу, попробуйте пройти по шагам программу для Windows на основе MFC и вы увидите, что в определенный момент она просто остановится, так как не знает куда дальше идти. При программировании в виде дерева этого бы не случилось, так как вы бы увидели четкие циклы ожидания на основе конкретных функций, а здесь этих функций нет. Нет функций типа scanf или getch, которые ждут ввода.

Можно наверно утверждать, что вызовы функций при программировании в DOS заменены сообщениями в Windows. Сообщения намного функциональнее, так как вы можете послать сообщение за пределы вашего кода, например, другой программе и используя сообщение вызвать в той программе необходимые действия не зная ни названия функции, ни метода реализации, ни каких-либо других параметров.

События и сообщения как они связаны ??? Каждое событие рождает сообщение. Сообщение это следствие события. Так кто может сгенирировать сообщения ???

Аппаратура
Диспетчер окон
Другие окна

Вообще сообщения описываются в виде констант начинающихся с WM_ описанных в файле winuser.h. Подобные константы введены для удобства. На самом деле сообщение, то есть информация о нем, передается в виде структуры MSG.

typedef struct tagMSG 
{ 
	HWND   hwnd;      // кому адресовано сообщение
	UINT   message;   // идентифкатор сообщения (WM_...)
	WPARAM wParam;    // дополнительная информация
	LPARAM lParam;    // дополнительная информация
	DWORD  time;      // значения системных часов
	POINT  pt;        // расположение курсора мыши
} MSG;

Программирование в Windows является событийным, то есть нельзя построить дерево вызовов функций для приложения. Кроме того вызызвать сообщение и соответственно реакцию программы может и внешняя среда и другие программы.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.