OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 11 Ноябрь, 2019 23:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Вопрос о LOOP
СообщениеДобавлено: Пятница, 18 Декабрь, 2015 21:09 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Пятница, 18 Декабрь, 2015 21:12 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2316
Откуда: Россия, Томск
В Windows обычно используется цикл while.
https://msdn.microsoft.com/ru-ru/librar ... 85%29.aspx


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Пятница, 18 Декабрь, 2015 21:22 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Александр Ильин писал(а):
В Windows обычно используется цикл while.
https://msdn.microsoft.com/ru-ru/librar ... 85%29.aspx

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


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Пятница, 18 Декабрь, 2015 21:43 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Пятница, 18 Декабрь, 2015 21:46 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
А разве это не есть колбэк? Если я правильно помню, то указанные Вами строки находятся в главной оконной процедуре винды. Указатель на главную процедуру сохраняют в классе окна, а экземпляр класса использует её для подключения к очереди событий и обработки событий.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Пятница, 18 Декабрь, 2015 21:49 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Представляю схему наподобие следующей:
  1. Регистрация callback для получения сообщений
  2. Подписка на получение сообщений
  3. ...
  4. получение сообщения через callback
  5. обработка сообщения через callback
  6. ...
  7. Отписка


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Пятница, 18 Декабрь, 2015 21:53 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Пятница, 18 Декабрь, 2015 21:57 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Пятница, 18 Декабрь, 2015 22:36 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
По поводу подписки-отписки.
Здесь есть два подхода:
    1. подписываться при запуске и отписываться при закрытии.

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Пятница, 18 Декабрь, 2015 22:57 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
В своём посте вопрос про бесконечный цикл Вы задали с оглядкой на колбэки. Уже понятно, что цикл нужен для выборки сообщений из очереди. Но вопрос был, скорее, про упрощение колбэка, верно? Очередь сообщений обрабатывается всегда одинаково. Почему бы не вынести её за пределы главной оконной процедуры? Тогда в ней остался бы только выбор обработчика события и обработка события.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Суббота, 19 Декабрь, 2015 08:50 
Аватара пользователя

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

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Суббота, 19 Декабрь, 2015 13:34 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Александр Ильин писал(а):
Обработка очереди находится в теле главного треда, а не в оконной процедуре.
Вы правы, я эти моменты уже подзабыл.

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2015 01:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9154
Откуда: Россия, Орёл
Если я не ошибаюсь, но в GTK как раз вместо цикла в приложении callback, который GTK-библиотека дергает периодически.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Вопрос о LOOP
СообщениеДобавлено: Воскресенье, 20 Декабрь, 2015 01:58 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2625
Откуда: Россия, Ярославль
Ну это же паттерн такой. У SDL2 есть два режима, внешняя петля и внутренняя. Это как библиотека и фреймворк, те же яйца.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB