класс - обработчик оконных сообщений

Тема в разделе "WASM.WIN32", создана пользователем maksim_, 29 июл 2009.

  1. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    Я создаю окошко и хочу чтобы мой класс обрабатывал сообщения:

    Код (Text):
    1. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
    2. {
    3.     if (msg == WM_CREATE)
    4.     {
    5.         CREATESTRUCT    *p_create_ctruct = (CREATESTRUCT*)lp;
    6.         CMyWndClass    *p_wnd = (CMyWndClass*)p_create_ctruct->lpCreateParams;
    7.  
    8.         SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)p_wnd);
    9.  
    10.         return    p_wnd->on_create(p_create_ctruct);
    11.     }
    12.  
    13.     if (CMyWndClass *p_wnd = (CMyWndClass*)GetWindowLongPtr(hwnd, GWLP_USERDATA))
    14.     {
    15.         return    p_wnd->on_window_message(msg, wp, lp);
    16.     }
    17.  
    18.     return    DefWindowProc(hwnd, msg, wp, lp);
    19. }
    меня интересует насколько сильно это отразится на производительности? получается что для каждого сообщения дёргается GetWindowLongPtr. я глянул на код этой апишки — системные вызовы она, вроде, не дёргает, т.е. работать должна довольно быстро. да и окошко — не заметно чтоб притормаживала отрисовка. но всё же, насколько такой способ приемлем и есть ли более разумные варианты?
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    приемлем. ничего необычного
    да. есть. используй глобальные переменные
     
  3. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    вы действительно думаете что использование глобальных переменных более разумно? мне этот способ ещё больше не нравится.
     
  4. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    maksim_
    Юзай ATL/WTL чтобы не изобретать велосипедов, а если оч хочется свое, можешь посмотреть как там сделано (хотя для того чтобы кусок в стеке везде нормально работал, MS в ядре, в обработчике исключений даже специальный кейс сделал)))
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Velheart
    Можно чуть подробнее об этом?
     
  6. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    Sol_Ksacap
    Насчет стека может это я попутал.., хотя мне всегда казалось, что atlthunk именно там аллокируется, а сейчас посмотрел, а там вроде как в хипе, но в любом случае в "как минимум в некотрых случаях неисполнимой памяти", и в KiDebugRoutine есть вызов KiCheckForAtlThunk(x,x), который проверяет не произошел ли эксепшн в thunk'е и если да -- эмулирует его -- KiEmulateAtlThunk(x,x,x,x,x), вообще я мельком смотрел, но походу как-то так.
     
  7. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    чем же?
     
  8. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Velheart
    Ага, спасибо. Хак вызывает страх.
     
  9. djmans

    djmans New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2006
    Сообщения:
    312
    это нормальный быстрый способ, он кажется даже в mfc юзается.

    >да. есть. используй глобальные переменные
    ужас.
     
  10. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    вообще глобальные переменные - зло. хотя бы из-за кеширования, релоков. по-моему, использование глобальных переменных портит облик программы.
     
  11. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    бред
     
  12. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    сишник и без тебя насоздает кучу глобальных переменных, ка и огромные части классов валяются как есть прямо в exe'шнике, а это просто тьма релоков. как в такой ситуации 1 ее испортит/улучшит?
     
  13. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    хорошо. хочу я создать 2 окна одного и того-же класса.
    что касается:
    ты не давай ему создавать.
    чем больше глобальных переменных - тем сложнее организовать многопоточность.
    если у тебя проект в несколько десятков тысяч строк кода, то попробуй найди при отладке какой кусок кода её модифицировал.
     
  14. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    1. глобальный счетчик объектов
    2. указатель на динамический массив
    каждое окно нумеруется и из массива выбирается для каждого окна нужное значение по индексам
    это не возможно. он тебя и не спросит. это не лечится
    ты про хардварные точки останова слышал? а если отладчик умеет это не выплевывать, а логировать, то еще проще! а вообще для доступа к таким ресурсам можно заюзать бит доступа или критическую секцию.
     
  15. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    ты представляешь себе как это будет выглядеть :))) тут уж действительно лучше GetWindowLongPtr.

    я бы не стал так утверждать. недавно апликуху писал с базонезависимым кодом. единственное что пришлось - адреса строк восстанавливать.

    отладчик у меня msvc. честно говоря, я даже не знаю - можно ли в студии ставить бряки на изменение памяти. скорее всего нет. а что касается юзанья критических секций спинлоков и прочего - я это и имею ввиду - усложнение реализации.
     
  16. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    это время компиляции что ли базонезависимым. в любом случае, могу поспорить, это не есть просто (в реализации)
    а вот строки это и есть те самые глобальные переменные (как минимум строки)
    лочим
    Код (Text):
    1. lock bts [x],0
    2. jc wait
    разлочим
    Код (Text):
    1. lock btr [x], 0
    че сложного?
    ну так возьми нормальный. olly там или Syser
     
  17. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    честно говоря, не понял ответа. в любом случае, вопрос сейчас не в базонезависимом коде.
    ну, допустим. хотя, тут нужно уточнить, что строки-то всё таки read-only. это означает то, что компилятор может запихать все строки в секию кода (часто так и происходит) и не создавать дополнительные страницы в памяти при загрузке нескольких модулей. строки ни коем образом не будут мешать многопоточности.

    всё чрезвычайно просто и понятно. честно говоря, я даже не понял что вы тут пытались сделать...

    ну, я не такой спец, чтобы писать проги в студии, а отлаживать их под олькой. да и не думаю что они для этого предназначены.
     
  18. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    ну я не сказал, что только строки. статические части классов могут валяться болванкой в тойже секции кода (или данных), копироваться в динамическую память и там чуть видоизменяться (но чаще прямо так и используются, как есть, болванкой)
    использовать 0 бит переменной x для синхронизации (правда нодо сперва удостовериться, что он не будет использоваться, но это мелочи. если даже используются все биты, то ни кто не запрещает создать битмап или отдельную переменную флагов)
    дебаговую информацию отменили?
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    maksim_
    Альтернативных способов множество, вот только в той среде они криво написаны будут, аналогично как и этот. Среду следует выбрать такую, чтобы она обладала достаточной гибкостью для решения задачи. Иначе как в этом примере так криво и будет.
     
  20. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    эту фразу спишу на то, что вы никогда не занимались болишыми проектами.