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

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

Страницы: 1 2 3 4 529 Следующая »
#30
15:27, 10 мая 2021

Не читал, что выше написано. Но на мой взгляд логично сделать List с колбеками для окон. А вообще это вопрос по теории операционных систем. Наверняка в системе хранится список дескрипторов всех приложений (то бишь окон). Там наверно и хранятся ссылки на все колбэки.


#31
15:35, 10 мая 2021

В условиях многозадачности программы прерываются и возобновляются в месте прерывания что обеспечивает иллюзию непрерывности потока исполнения алгоритма.
Если ОС будет вмешиваться в поток и дергать функции "сообщений" напрямую, то это разрушит логику исполнения потока.

#32
15:47, 10 мая 2021

=A=L=X=
> WndProc из WinAPI хренова тем что гигантский switch может образоваться без
> возможности сильных оптимизаций - поле кодов сообщений гигантское

Так проблема-то в чем, в том что свитч медленный или в том, что неудобочитаемый? Насчет медленности спорный вопрос, оптимизация switch табличными переходами (в совокупности с разбивающими/ограничивающими ветвлениями) была в компиляторах еще с 90-х годов.

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

А если проекты крупные - обычно макросами свитч строился, обычно уже сразу готовыми, которые поставлял фреймворк (OWL, MFC). По одной строчке на событие - как еще удобнее можно?

#33
15:52, 10 мая 2021

NetSpider
> Если ОС будет вмешиваться в поток и дергать функции "сообщений" напрямую, то
> это разрушит логику исполнения потока.
Не обязательно. При правильной организации все будет окей.

#34
(Правка: 15:59) 15:58, 10 мая 2021

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

А ты так и не понял что всемогутера нету и в каждом конкретном случае нужно чем то жертвовать: -удобством использования; -скоростью работы; -расходом памяти; -гибкостью; -размером бинарника;

#35
(Правка: 16:09) 16:09, 10 мая 2021

Dmitry_Milk
> Насчет медленности спорный вопрос, оптимизация switch табличными переходами (в
> совокупности с разбивающими/ограничивающими ветвлениями) была в компиляторах
> еще с 90-х годов.

А там табличный не получится - я же писал сразу - поле WM_num простирается на десятки сотни чисел и сделать тупую таблицу перехода - это анрил. Там всё и много и реальные потребности разряжены.
Поэтому в универсальном и видимо лучшем случае - дерево переходов - бинарный поиск или типа того.
Короче гемор на ровном месте.

#36
16:12, 10 мая 2021

skalogryz
gtk - это уровень приложения, там можно себе позволить, а в винапи системный кольцевой буфер сообщений - уже есть ограничения.
И в винапи можно же было задать "границы" сообщений?

#37
(Правка: 16:22) 16:21, 10 мая 2021

gamedevfor
> ты так и не понял что всемогутера нету и в каждом конкретном случае нужно чем
> то жертвовать: -удобством использования; -скоростью работы; -расходом памяти;
> -гибкостью; -размером бинарника;

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

#38
16:23, 10 мая 2021

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

#39
16:28, 10 мая 2021

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

}:+()___ [Smile]
> Другое дело, осиливает ли это компилятор (особенно такой отстойный, как MSVC).

В смысле? Любые типы данных, окромя дебильного stl, вера запрещает?

#40
16:32, 10 мая 2021

clc
> gtk - это уровень приложения, там можно себе позволить, а в винапи системный
> кольцевой буфер сообщений - уже есть ограничения.
а как gtk под винду работает тогда? :)

#41
16:54, 10 мая 2021

как обычно: поллингом для основного окна (скорее всего, деталями никогда не интересовался)

#42
(Правка: 17:06) 17:06, 10 мая 2021

Если бы я писяль выняпи, мой месжпроц был бы таким:

void WndProc(HWND uindou, const MESSAGE_T* param);

#43
17:21, 10 мая 2021

}:+()___ [Smile]
> Другое дело, осиливает ли это компилятор (особенно такой отстойный, как MSVC).

Ну мне приходилось копаться дизасмах свитчей в коде конца 90-х начала нулевых, не знаю, каким компилятором компиляли, но скорей всего MSVC, т.к. там все thiscall были через ecx. Так вот там было обычным делом, что проверяемое значение проверялось бранчем на границу, после проверки из него вычиталось смещение и шел косвенный переход через таблицу размерами в десятки элементов, из которых только считанное количество вели на специальные выходы, а все остальные - на один и тот же. И были случаи, когда предварительные бранчи разруливали в две или три разных таблицы.

#44
17:23, 10 мая 2021

если сделать свитч по перечислению, то скорее всего компилятор сделает правильно

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