|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Событийная модель Windows |
|
Событийная модель Windows
|
Ветеран Сообщения: 784 |
Профиль | Отправить PM | Цитировать Почитал доки по событиям Windows. Везде пишут по теме с точки зрения прикладного программиста, т.е. "получил сообщение", "обработал событие" и т.п. А что конкретно делают потоки и процессы при этом (и какие потоки и процессы) - об этом ни слова...
Пока сложилась следующая картина: 1. При возникновении прерываний от железа аппаратно вызываются соответствующие обработчики. 2. (а вот здесь не понятно, что далее делают эти обработчики (стандартные) и что происходит до момента, когда ось начинает отправлять сообщения приложениям). 3. ОС записывает информацию о произошедшем событии (т.е. посылает сообщение) всем запущенным приложениям (естественно только о тех событиях, которые должны обрабатывать GUI-приложения) в очереди сообщений (message queue). 4. Главные потоки приложений циклически проверяют свой буфер (очередь) сообщений и если там обнаруживается информация о произошедшем событии, то вызывается главный обработчик событий приложения (например, OnMessage объекта Application). 5. Главный обработчик событий приложения сам обрабатывает это событие, затем по очереди вызывает обработчики DefWindowProc всех графических элементов приложения, находящихся в непосредственном владении приложения, в частности (и обычно) главного окна приложения. 6. Затем свои обработчики DefWindowProc этих подчинённых графических элементов сами обрабатывают событие и по очереди вызывают обработчики DefWindowProc уже своих подчинённых графических элементов (например, кнопки на форме) и т.д. 7. Обработчики DefWindowProc всех графических элементов приложения в зависимости от события и наличия обработчиков этих событий вызывают эти обработчики (код которых и пишут прикладные программисты). Ну вот, приблизительно всё так, но в то же время и не так... 8)__________________________________________________ Ну, и вопрос по фоновым процессам. Если обработка очереди сообщения приложения происходит в цикле (т.е. главный поток приложения всё время работает), то потоки фоновых процессов (у которых самый низкий приоритет) вообще не будут выполняться... |
|
Отправлено: 11:28, 13-11-2006 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Цитата:
Цитата В.И.Юров:
|
||
------- Отправлено: 12:57, 13-11-2006 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать Цитата:
Затем, никакого "главного" обработчика событий (кроме цикла выборки сообщений из очереди потока) нет. DispatchMessage высылает сообщение сразу соответствующему обработчику. DefWindowProc - это вообще стандартная функция (как ни странно, для реализации поведения окна "по умолчанию"). Из твоего кода она вызывать ничего никогда не будет (но может послать некие события). Для реализации "красивого" апи окошек C++ Builder делает нечто похожее на следующее. Создаёт свою оконную процедуру, которой будут поступать все сообщения окна. Затем с помощью GetWindowLong получает указатель на объект формы, которой это окно является. Если пришедшее сообщение соответствует некому обработчику (например WM_KEYDOWN -> OnKeyDown), то вызывает соответствующий метод объекта и возвращает 0. Иначе вызывает DefWindowProc для реализации поведения по умолчанию. (Примерно так. Билдер даже никогда не щупал, но принципиально по другому и не сделаешь). Цитата:
Кстати, вот что нашёл: http://winpro.narod.ru/Messages.htm Достаточно популярное объяснение. |
||
------- Отправлено: 14:22, 13-11-2006 | #3 |
Ветеран Сообщения: 784
|
Профиль | Отправить PM | Цитировать Цитата:
Т.е. почему бы всегда не останавливать работу потока до появления новых сообщений (т.е. до тех пор, пока очередь сообщений станет непустой) ? Ведь во фрагменте кода потока, где циклически проверяется очередь сообщений, никаких других действий, кроме проверки этой очереди, не происходит. Т.е. цикл будет крутиться впустую... Цитата:
Цитата:
___________________________________ И как быть с событиями неграфических объектов (т.е. не имеющих графического представления и, следовательно, не имеющих дескрипторов), например, в Delphi или C++ Builder (которые шлёпают мышой на форму)? Должно быть, эти события - не что иное, как обычный вызов обработчиков (методов объекта) из других методов этих объектов. Т.е. никаких манипуляций с очередями сообщений потоков здесь не происходит... |
|||
Отправлено: 21:06, 13-11-2006 | #4 |
Ветеран Сообщения: 784
|
Профиль | Отправить PM | Цитировать Фрагмент одной статьи:
Цитата:
Для любого окна выполняется код обработки сообщений соответствующего потока (даже если нет сообщений, крутится вхолостую). Чем не претендент на очередь диспетчера... |
||
Отправлено: 21:18, 13-11-2006 | #5 |
Обратный инженер Сообщения: 644
|
Профиль | Отправить PM | Цитировать Цитата:
Цитата MSDN:
|
||
------- Отправлено: 00:35, 14-11-2006 | #6 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата:
Цитата:
|
||
Отправлено: 08:27, 16-11-2006 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Доступ - [решено] модель совместного доступа | kolhicin | Microsoft Windows 2000/XP | 12 | 06-10-2009 16:31 | |
Разное - модель LWM ( защита информации) | Любаня | Хочу все знать | 1 | 17-04-2009 17:30 | |
Модель SiS-651C | DanPorter | Материнские платы и память | 9 | 28-06-2008 21:08 | |
как узнать модель видеокарты. | mikola1983 | Видеокарты | 13 | 13-04-2008 15:34 |
|