forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Обработка WM_CLOSE (http://forum.boolean.name/showthread.php?t=4139)

impersonalis 13.08.2007 04:53

Обработка WM_CLOSE
 
На сколько я понимаю, современная концепиця обработки событий от пользователя заключается в периодическом получении сообщений от внешних устройств, которые локализуются приложенеим в сообщения от гуёвых гаджетов и устройств, и заносятся в некий стек уникальный для каждого процесса на момент его выполнения.
В процессе своей работы процесс периодически черпает сообщения из стека и выполняет проассоциированную с ними функцию (карта сообщений в MFC [которая, насколько мне известно, являетя макро-командой и разворачиывается в соответсвтующий код]), или обновляет состояние внутренних переменных, наткнувшись на соответствующий запрос ( MouseHitи подобные в Blitz). После чего сообщение удаляется. Причём, входе обработки могут быть порождены новые сообщения (WM_CLOSE вызывает WM_DESTROY и WM_NCDESTROY [они провоцируются ф-цией DestroyWindow( ), которая была взывана ф-цией OnClose() - обработчиком для WM_CLOSE]).
Если Windows в ходе выполнения процесса обнаруживает "застой" в обработке сообщений (пользователь судорожно колошматит по зависшей форточке - а та выполняет громоздкий цикл, и, соответвенно, сейчас не происходит анализ сообщений - стек продолжает увеличиваться) - то она предлагает пользователю принудительно завершить работу приложения, обозначив её как "не отвечает".

Теперь вопрос:
В каких дебрях спрятана обработка события WM_CLOSE в прогах, скомпиленных Blitz3D. Ведь программа закрывается штатно, даже если она была прервана на выполнении цикла! Значит обработка сообщения происходит не при вызове соответствующих функий опроса (как было предположено выше), а отдельно - причём не понятно где: ну не через команду же прога это делает?
И ещё вопрос - как эффиктивнее всего реализовать перехват закрытия через WM_CLOSE на б3д?

jimon 13.08.2007 11:13

Re: Обработка WM_CLOSE
 
Вложений: 2
impersonalis
про мультипоточность не думал ? :)
в bmax к примеру system hook висит отдельным потоком
тоесть и в blitz3d тоже все mousehit\keyhit обновляются отдельно

в общем есть либа которая перехватывает сообщение WM_CLOSE
для тебя специально потратил 40 секунд копаясь в архивах :)
в общем смотри атач, ето не особо то что тебе надо
но я думаю поймеш в какую сторону копать надо

Platon 13.08.2007 11:45

Re: Обработка WM_CLOSE
 
Цитата:

Сообщение от impersonalis
И ещё вопрос - как эффиктивнее всего реализовать перехват закрытия через WM_CLOSE на б3д?

Да просто callback установи на блицевское окно (SetWindowLong) и отлавливай какие нужно массаги.

impersonalis 13.08.2007 14:37

Re: Обработка WM_CLOSE
 
2jimon
хочешь сказать что программа выполняется как два коррелирующих процесса, т.е. две эдаких квази-проги?

jimon 13.08.2007 16:09

Re: Обработка WM_CLOSE
 
impersonalis
тип того :)

Platon 13.08.2007 19:54

Re: Обработка WM_CLOSE
 
ГЫ, в этом BlitzClose тоже оконная функция-перехватчик ставится. А исходник-то какой ужасный.


Часовой пояс GMT +4, время: 18:36.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot