Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сделать калбэк функцию окна объектной, велосипед 
:(
    Опции темы
Alexeis
Дата 5.4.2013, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



Цитата(GremlinProg @  5.4.2013,  09:17 Найти цитируемый пост)
Alexeis, пытается троллить, забавно. В цитате я об этом и написал  
только размер делегата равен не 8 байтам, а равен размеру двух указателей (в x64 это 16 байт)


Неа, ты писал 

Цитата(GremlinProg @  4.4.2013,  16:01 Найти цитируемый пост)
Скорее всего, это реализация событий у борланда, с процедурой окна она не имеет ничего общего, просто борланд унифицирует таким образом делегат (этот подход у него как минимум с Delphi 3-4)

Это когда указатель на метод склеивается с указателем на объект и представляется универсальным функтором, который можно вызвать как простую функцию в любом контексте.

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GremlinProg
Дата 6.4.2013, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Alexeis, ты можешь, конечно называть апельсин помидором, но суть от этого не поменяется,
цитируя ты повторил то же самое, о чем я писал.

О том, как делал процедуру окна борланд в Delphi я тоже писал (последний абзац). Поясняю: он это делал аналогично тому, как предложил borisbn, только борланд вместо installWindowProc просто регистрировал начальную процедуру окна(InitWindowProc), которая делала инициализацию окна и подставляла на свое место штатную StdWindowProc. Я просто это все пишу по памяти, т.к. уже много лет не работаю с продуктами от борланд.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
mes
Дата 6.4.2013, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(Alexeis @  5.4.2013,  22:20 Найти цитируемый пост)
, основной замес именно в подмене функции окна.  

вариантов прикрутить не много.. пару уже назвали,  это хранение this в отведенной области, и генерация машиного перехода... 
остался маппинг hwnd на this и заготовка достаточного объема статических функций со связанным аргументом.. 
У каждого из подходов есть свои недостатки..  Иногда бывает полезным смешать разные подходы.. 



--------------------
PM MAIL WWW   Вверх
Alexeis
Дата 6.4.2013, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



mes, мне кажется самым экономным будет использование 
Цитата(mes @  6.4.2013,  17:24 Найти цитируемый пост)
остался маппинг hwnd на this и заготовка достаточного объема статических функций со связанным аргументом.. 

  Ммм...? А зачем иметь много статических функций? Разве недостаточно одной функции у общего базового класса? Функцию-член обработки сообщений окна делаем виртуальной и соответственно для каждого производного класса можно перекрывать обработку сообщений.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
volatile
Дата 7.4.2013, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



borisbn, привел хороший способ. Благо в WinApi, во многих местах присутствует что-то типа void *userdata
имхо самое место для указателя на класс.
Способ борланда, конечно некрасив, но им же не надо было думать о кроссплатформенности, и прочих табу ... наложенных на С++ прикладников.
Зато их способ, чуток должен быть эффективней. А вызов функций, это именно то место, где не помешает подумать об эффективности.
Так что, их способ, тоже имеет право на существование. и их можно понять.
С маппингом, думаю, будет совсем не эффективно.
короче, голосую за способ borisbn
PM MAIL   Вверх
mes
Дата 7.4.2013, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(Alexeis @  6.4.2013,  16:15 Найти цитируемый пост)
 Ммм...? А зачем иметь много статических функций? Разве недостаточно одной функции у общего базового класса? 

это два разных варианта )  маппинг hwnd и "маппинг" оконной функции ))

Добавлено через 4 минуты и 43 секунды
Цитата(volatile @  6.4.2013,  23:42 Найти цитируемый пост)
С маппингом, думаю, будет совсем не эффективно.
прям уж совсем ? на 1000 окон около 10 "лишних сравнений"...



--------------------
PM MAIL WWW   Вверх
volatile
Дата 7.4.2013, 01:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(mes @  7.4.2013,  00:50 Найти цитируемый пост)
на 1000 окон около 10 "лишних сравнений"...

10 сравнений чтобы вызвать одну функцию, думаю что да, совсем не эффективно.
 smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0794 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.