OberonCore
https://forum.oberoncore.ru/

Вопрос о LOOP
https://forum.oberoncore.ru/viewtopic.php?f=60&t=5591
Страница 1 из 1

Автор:  Роман М. [ Пятница, 18 Декабрь, 2015 21:09 ]
Заголовок сообщения:  Вопрос о LOOP

Задам, возможно, детский вопрос: почему в языках программирования вообще применяется механизм бесконечной петли LOOP ... END для реализации петли сообщений/событий?
Используя петлю сообщений, как задействуются аппаратные ресурсы, с учётом многоядерности процессоров? Неужели никакие ОС не предоставляют свой механизм для этих целей?

Автор:  Александр Ильин [ Пятница, 18 Декабрь, 2015 21:12 ]
Заголовок сообщения:  Re: Вопрос о LOOP

В Windows обычно используется цикл while.
https://msdn.microsoft.com/ru-ru/librar ... 85%29.aspx

Автор:  Роман М. [ Пятница, 18 Декабрь, 2015 21:22 ]
Заголовок сообщения:  Re: Вопрос о LOOP

Александр Ильин писал(а):
В Windows обычно используется цикл while.
https://msdn.microsoft.com/ru-ru/librar ... 85%29.aspx

О том и речь.
Условно цикл таков:
Код:
LOOP
   GetMessage();
   ProcessMessage();
   IF quit THEN EXIT END
END


Почему ОС не предоставляют механизма наподобие callback для ProcessMessage?

Автор:  Александр Ильин [ Пятница, 18 Декабрь, 2015 21:43 ]
Заголовок сообщения:  Re: Вопрос о LOOP

Роман М. писал(а):
Почему ОС не предоставляют механизма наподобие callback для ProcessMessage?
Как вы представляете себе работу этого callback'а с точки зрения того, что тред обработки сообщений в приложении только один, а сообщения могут приходить в любое время, в том числе до того, как вернётся предыдущий вызов?

Нужна очередь сообщений. И нужен цикл по забору их из очереди с последующей обработкой. Этот цикл должен выполняться в каком-то треде. Если у нас уже есть тред приложения, зачем нам организовывать ещё один скрытый системный тред для кормления того треда с ложечки? Пусть сам берёт на своё усмотрение.

Автор:  Valery Solovey [ Пятница, 18 Декабрь, 2015 21:46 ]
Заголовок сообщения:  Re: Вопрос о LOOP

А разве это не есть колбэк? Если я правильно помню, то указанные Вами строки находятся в главной оконной процедуре винды. Указатель на главную процедуру сохраняют в классе окна, а экземпляр класса использует её для подключения к очереди событий и обработки событий.

Автор:  Роман М. [ Пятница, 18 Декабрь, 2015 21:49 ]
Заголовок сообщения:  Re: Вопрос о LOOP

Представляю схему наподобие следующей:
  1. Регистрация callback для получения сообщений
  2. Подписка на получение сообщений
  3. ...
  4. получение сообщения через callback
  5. обработка сообщения через callback
  6. ...
  7. Отписка

Автор:  Александр Ильин [ Пятница, 18 Декабрь, 2015 21:53 ]
Заголовок сообщения:  Re: Вопрос о LOOP

Valery Solovey писал(а):
А разве это не есть колбэк? Если я правильно помню, то указанные Вами строки находятся в главной оконной процедуре винды. Указатель на главную процедуру сохраняют в классе окна, а экземпляр класса использует её для подключения к очереди событий и обработки событий.
Если я правильно помню, оконная процедура обрабатывает сообщения, пришедшие на адрес её HWND. Там просто switch по идентификатору сообщения, цикла нет.

Цикл находится в главном треде. Тред в цикле делает GetMessage-DispatchMessage. DispatchMessage как раз пересылает сообщение оконным процедурам по их HWND.

Автор:  Александр Ильин [ Пятница, 18 Декабрь, 2015 21:57 ]
Заголовок сообщения:  Re: Вопрос о LOOP

Роман М. писал(а):
Представляю схему наподобие следующей:
  1. Регистрация callback для получения сообщений
  2. Подписка на получение сообщений
  3. ...
  4. получение сообщения через callback
  5. обработка сообщения через callback
  6. ...
  7. Отписка
Цикл - это код. Всякий код находится в каком-то треде. Какой тред будет заниматься вызовом вашего callback? В текущей реализации момент этот цикл находится в главном треде приложения.

Что будет делать главный тред приложения? Спать до callback'а? В цикле? Он сейчас именно это и делает в GetMessage. По сути дела, callback'и - это оконные процедуры, вызываемые функцией DispatchMessage, а рассматриваемый цикл - это типовой способ организации данного механизма внутри приложения.

Автор:  Valery Solovey [ Пятница, 18 Декабрь, 2015 22:36 ]
Заголовок сообщения:  Re: Вопрос о LOOP

По поводу подписки-отписки.
Здесь есть два подхода:
    1. подписываться при запуске и отписываться при закрытии.

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

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

    И наконец, как отписываться? В случае штатного закрытия окна всё относительно просто: на событие закрытия окна создаём колбэк и там всё отписываем. А если закрытие было нештатным, то непонятно, что делать.

    2. не осуществлять явную подписку на события. Тогда операционная система будет считать, что окно подписано на все события. А решение по его обработке будет оставлено на усмотрения единственного колбэка.

Автор:  Valery Solovey [ Пятница, 18 Декабрь, 2015 22:57 ]
Заголовок сообщения:  Re: Вопрос о LOOP

В своём посте вопрос про бесконечный цикл Вы задали с оглядкой на колбэки. Уже понятно, что цикл нужен для выборки сообщений из очереди. Но вопрос был, скорее, про упрощение колбэка, верно? Очередь сообщений обрабатывается всегда одинаково. Почему бы не вынести её за пределы главной оконной процедуры? Тогда в ней остался бы только выбор обработчика события и обработка события.

Почему так не сделали в винде? Тому есть две причины.
1. Обработка диалоговых окон и горячих клавиш, которые видоизменят цикл из Вашего сообщения. Хотя непонятно, почему было не сделать четыре обработчика очереди и определять нужный на этапе инициализации...
2. Это винда, и в ней всё страшное. Если бы они сделали нормальный колбэк, то он бы выглядел неестественно в окружении всего остального.

Автор:  Александр Ильин [ Суббота, 19 Декабрь, 2015 08:50 ]
Заголовок сообщения:  Re: Вопрос о LOOP

Valery Solovey писал(а):
Очередь сообщений обрабатывается всегда одинаково. Почему бы не вынести её за пределы главной оконной процедуры?
Обработка очереди находится в теле главного треда, а не в оконной процедуре.
Valery Solovey писал(а):
Тогда в ней остался бы только выбор обработчика события и обработка события.
В оконной процедуре и так находится только выбор обработчика и обработка.
Valery Solovey писал(а):
Почему так не сделали в винде?
Именно так и сделали.

См., например, здесь главу "A simple window", а так же перед ней главы "Messages" и "Window procedure".
int WINAPI wWinMain - это код треда, содержит цикл выборки сообщений.
LRESULT CALLBACK WndProc - это оконная процедура, содержит выбор обработчика и обработку.

Я же так и написал вчера.

Valery Solovey писал(а):
2. Это винда, и в ней всё страшное.
Теперь, когда стало ясно, что в винде сделано именно так, как вы придумали, она стала немного прекраснее, верно?

Valery Solovey писал(а):
Хотя непонятно, почему было не сделать четыре обработчика очереди
...

Автор:  Valery Solovey [ Суббота, 19 Декабрь, 2015 13:34 ]
Заголовок сообщения:  Re: Вопрос о LOOP

Александр Ильин писал(а):
Обработка очереди находится в теле главного треда, а не в оконной процедуре.
Вы правы, я эти моменты уже подзабыл.

Но не в этом суть. Я хотел сказать, что обработчик сообщений может находиться вне исходного кода приложения.

Александр Ильин писал(а):
Теперь, когда стало ясно, что в винде сделано именно так, как вы придумали, она стала немного прекраснее, верно?
Естественно, нет. Когда я ею занимался, то видел достаточное количество моментов, которым так и не смог найти объяснения. С точки зрения программирования, а с точки зрения обратной совместимости они, возможно, окажутся объяснимыми. Например, зачем столько полей у класса окна или почему так много параметров у функции создания экземпляра окна?

Автор:  Илья Ермаков [ Воскресенье, 20 Декабрь, 2015 01:07 ]
Заголовок сообщения:  Re: Вопрос о LOOP

Если я не ошибаюсь, но в GTK как раз вместо цикла в приложении callback, который GTK-библиотека дергает периодически.

Автор:  Пётр Кушнир [ Воскресенье, 20 Декабрь, 2015 01:58 ]
Заголовок сообщения:  Re: Вопрос о LOOP

Ну это же паттерн такой. У SDL2 есть два режима, внешняя петля и внутренняя. Это как библиотека и фреймворк, те же яйца.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/