Войти
ФлеймФорумПрограммирование

Если бы вы писали WinAPI - как бы вы рассылали сообщения окнам? (2 стр)

Страницы: 1 2 3 429 Следующая »
#15
13:47, 10 мая 2021

=A=L=X=
> Работаешь на майских?
Я с 4 по 7 включительно. Главный наш сказал: "Всем = работать" (с).


#16
(Правка: 13:58) 13:57, 10 мая 2021

Я на самом деле почти придумал как, но кое что мешается.
Как мы помним из многих тем если реализовать GUI то почти всегда получится ООП.
Суть собственно в этом - в том чтобы окно вело себя как полиморфный объект где события приходят вызовом "методов".
Но т.к. нам нужна совместимость с Си и как можно большим зоопарком языков, то решение вопроса уже встретилось в природе ранее и называется COM-объекты.
Т.е. да, как ни удивительно, но именно MS много позднее придумывает (вернее как это часто было - покупает) технику.

Но нам надо избежать того чтобы в объекте было 100500 методов как всех возможных событий WinAPI, поэтому мы разбиваем весь спектр того на что окно может "подписаться" на набор интерфейсов конечно же!
Т.е., например, если нужны события от мыши, то имплементируем интерфейс IMouseListener:

struct IMouseListener
{
   void (*OnMouseClick)( HWND wnd, uint btns, int x, int y );
   void (*OnMouseMove)( HWND wnd, int newX, int newY );
   ...
}
Если мы хотим чтобы система посылала нашему окну сообщения вида MouseListener мы действительно просто регистрируем, что окно поддерживает интерфейс IMouseListener.
К интерфейсам в смысле COM оно мало имеет отношения, поэтому тут не надо никаких AddRef/Release - это просто перечислители адресов свободных функций которые реализуют реакции на события.
Как именно - думаю полезно так же как и в WinAPI сделать это через некий опять таки WNDCLASS, но в нём главное что нам надо это не функция WndProc, но функция GetInterface( const char *name ) которую система вызывает единожды собираясь первый раз послать в окно данного класса первое сообщение определенного интерфейса и внутри себя поддерживает для каждого класса массив полученных указателей.
Таким образом если окну не нужно дефолтное поведение оно может вообще не реализовывать интерфейс, а если нужна частичная реализация - то просто выставить все ненужные слоты в своей IMouseListener в nullptr - так система поймёт, что ничего никуда посылать не надо.

Но если задуматься над будующим, то желательно как то так приспособить чтобы в ООП-языках легко было делать или трамплины или вообще прямой вызов методов в их объектах.
Для этого, имхо, достаточно договорится чтобы первым параметром всех методов был не HWND, а userData типа size_t который приклеивается к конкретным экземплярам окон.
В этом случае чуток помутив с calling convention языки типа плюсов или Delphi легко вшили бы эту систему в свои классы.
Ну вот как то так.
Но есть проблема - очередь сообщений куда надо эти вызовы класть отложенно.
В принципе в ассемблере её намутить кмк реально, но надо подумать не будет ли проблем с интерфейсами которые не заложены в систему из коробки.

#17
14:09, 10 мая 2021

=A=L=X=
> Если мы хотим чтобы система посылала нашему окну сообщения вида MouseListener
> мы действительно просто регистрируем, что окно поддерживает интерфейс
> IMouseListener.


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

#18
14:11, 10 мая 2021

gamedevfor
> Неудобно потому что часто такое требуется в рантайм, поэтому регистрация
> коллбэков предпочтительнее.

Во первых я расписал почему оно в рантайме работает максимально быстро.
Во вторых предлагая-предлагай. Расскажи как ты собираешься тут ускорить что-то. Не выльется ли реализация в хешмап зарегистрированных кэллбеков для каждого окна, например.

#19
14:19, 10 мая 2021

=A=L=X=
> Во вторых предлагая-предлагай. Расскажи как ты собираешься тут ускорить что-то.
> Не выльется ли реализация в хешмап зарегистрированных кэллбеков для каждого
> окна, например.

Если тебе нужна скорость то GUI библиотеку нужно строить на С++ шаблонах, такая даже была в природе называлась WTL.
Если речь про коллбеки то это не про скорость GUI, а про удобства и гибкость.

#20
14:22, 10 мая 2021

gamedevfor
> Если тебе нужна скорость

Что нужно написано в первопосте.

#21
14:25, 10 мая 2021

=A=L=X=
Тогда пиши на макросах )))

#22
14:28, 10 мая 2021

gamedevfor
> Тогда пиши на макросах )))

Еще раз: что нужно - написано в первопосте.
Например предлагать написать на макросах  - не нужно. Нужно конкретное описание кода и данных реализующих сабж.
Гд как обычно конечно - сказать по теме у большинства нечего, но острое желание что-нибудь да сказать пронизывает от пят до жопы насквозь.

#23
14:31, 10 мая 2021

=A=L=X=
А что тебе не понятно?
Очереди сообщений - самое тормозное но самое гибкое;
Коллбэки - быстрее но гибкость немного хуже;
Макросы - самое быстрое что можно придумать но совсем не гибкое;

#24
14:49, 10 мая 2021

Mirrel
На какой странице ты догадаешься, что тут речь идёт об альтернативных подходах ВМЕСТО винапи, а не подходах его использования?

#25
(Правка: 14:58) 14:54, 10 мая 2021

1 frag / 2 deaths, пример альтернативного подхода покажи. Хоть в какой-нибудь системе, в которой окно не будет опрашивать события.

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

#26
(Правка: 15:15) 14:54, 10 мая 2021

1 frag / 2 deaths
> ВМЕСТО винапи, а не подходах его использования?
А это еще бабушка надвое сказала. ТС так и не понял, чем одно отличается от другого. Хотя я дал исчерпывающий ответ на оба вопроса.

#27
15:14, 10 мая 2021

1 frag / 2 deaths
> ВМЕСТО винапи
Вместо винапи предлагаю linups! Ой, ну да, там же свои ограничения, накладываемые ОС, и драйверы пишутся на голом энтузиазме. Ну да ладно, и так сойдет.

#28
15:16, 10 мая 2021

gamedevfor
> А что тебе не понятно?

Да в общем то ничего. Ты не предложил ни идей кода ни идей данных.

#29
15:18, 10 мая 2021

=A=L=X=
> Речь не про общую картину кто ждёт а кто опрашивает, а про альтернативные
> реализации самой обработки сообщений.
в gtk это реализовывали
тем что у тебя нет обработки сообщений на прямую. Ты сам подписываешься на те сообщения которые тебе интересны.
Причём ты указываешь при подписке, хочешь ли ты обрабатывать их до или после системной обработки. А это иногда очень неудобно (в тех случаях когда ты при каких-то условиях системную обработку не желаешь)

АПИ полностью Си-шный

Страницы: 1 2 3 429 Следующая »
ФлеймФорумПрограммирование