Форум: "WinAPI";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
ВнизЦикл обработки сообщений Найти похожие ветки
← →
nexxiss (2004-05-21 13:39) [0]Добрый день. У меня возник следующий вопрос:
Как правильно организовать обработку сообщений с помощью функции PeekMessage ?
С GetMessage все корректно работает, а вот с PeekMessage после завершения работы приложение "не умирает до конца". Я был бы благодарен, если кто-нибудь приведет пример этого цикла.
← →
panov © (2004-05-21 13:47) [1]Ты бы привел свой пример, всё должно работать...
← →
Игорь Шевченко © (2004-05-21 14:09) [2]RTFS: Forms.pas TApplication.Run
← →
nexxiss (2004-05-21 14:16) [3]Вот так это выглядит у меня:
while true do
begin
if PeekMessage(Msg,Wnd,0,0, PM_REMOVE)
then
begin
if Msg.message = WM_QUIT then break;
TranslateMessage(Msg);
DispatchMessage(Msg);
end
else
begin
.......
.......
.......
end;
end;
← →
Digitman © (2004-05-21 14:19) [4]
> nexxiss
чем оправдано использование PeekMessage() ? в каком контексте этот цикл используется ?
← →
nexxiss (2004-05-21 14:22) [5]Вместо многоточия происходит рендеринг сцены.
← →
Digitman © (2004-05-21 14:36) [6]
> Вместо многоточия происходит рендеринг сцены
а это здесь при чем ?
имелось ввиду - почему не использован цикл с GetMessage или почему не использован тот же Application.Run ?
что происходит после выхода из цикла по условию получения WM_QUIT ?
← →
nexxiss (2004-05-21 15:09) [7]>что происходит после выхода из цикла по условию получения WM_QUIT ?
Прерывается цикл обработки сообщений, и приложение заканчивает работу.
>чем оправдано использование PeekMessage() ? в каком контексте этот цикл используется ?
>имелось ввиду - почему не использован цикл с GetMessage или почему не использован тот же Application.Run ?
На сколько я понимаю, в этом случае "мои действия" происходят независимо: в очереди сообщений есть или нет, значит они ( действия) будут повторятся чаще ( чего, собственно, и хочется), или я в чем то ошибаюсь ?
← →
Digitman © (2004-05-21 15:26) [8]а зачем тебе их , действия, чаще делать ?
ты строишь анимационные кадры ? выноси циклический рендеринг в доп.код.поток, после построения очер.кадра доп.поток шлет сообщение осн.потоку, указывая на данные только что построенной сцены .. основной поток крутится в цикле while GetMessage() do .. получив от доп.потока сообщение, осн.поток забирает эти данные и визуализирует их
← →
nexxiss (2004-05-21 15:38) [9]На мой взгляд использовать цикл с PeekMessage на много проще, да и в разных статьях рекомендую именно такую конструкцию. Все прекрасно работает, но проблема в том, что процесс после завершения приложеня продолжает существовать.
В одном из примеров, после цикла обработки сообщений добавлено следующее:
ExitProcess(Msg.wParam);
т.е. полный код такой:
while true do
begin
if PeekMessage(Msg,Wnd,0,0, PM_REMOVE)
then
begin
if Msg.message = WM_QUIT then break;
TranslateMessage(Msg);
DispatchMessage(Msg);
end
else
begin
.......
.......
.......
end;
end;
ExitProcess(Msg.wParam);
Что в данном случае будет находиться в Msg.wParam ?
← →
nexxiss (2004-05-21 15:39) [10]На мой взгляд использовать цикл с PeekMessage на много проще, да и в разных статьях рекомендую именно такую конструкцию. Все прекрасно работает, но проблема в том, что процесс после завершения приложеня продолжает существовать.
В одном из примеров, после цикла обработки сообщений добавлено следующее:
ExitProcess(Msg.wParam);
т.е. полный код такой:
while true do
begin
if PeekMessage(Msg,Wnd,0,0, PM_REMOVE)
then
begin
if Msg.message = WM_QUIT then break;
TranslateMessage(Msg);
DispatchMessage(Msg);
end
else
begin
.......
.......
.......
end;
end;
ExitProcess(Msg.wParam);
Что в данном случае будет находиться в Msg.wParam ?
← →
Digitman © (2004-05-21 15:49) [11]The WM_QUIT message indicates a request to terminate an application and is generated when the application calls the PostQuitMessage function. It causes the GetMessage function to return zero.
WM_QUIT
nExitCode = (int) wParam; // exit code
Parameters
nExitCode
Value of wParam. Specifies the exit code given in the PostQuitMessage function.
т.е. либо параметр, переданный при вызове PostQuitMessage() (при каких условиях и где ты вызываешь PostQuitMessage() - это совершенно непонятно), либо wParam-параметр , переданный обычным вызовом Sendmessage(..WM_QUIT..)
> процесс после завершения приложеня продолжает существовать
см. описание ExitProcess()
Terminating a process does not necessarily remove the process object from the operating system. A process object is deleted when the last handle to the process is closed.
очевидно, в ходе рендеринга ты занимаешь какие-то ресурсы ОС (открывая их хэндлы) и не освобождаешь их (не закрываешь открытые хэндлы) перед ExitProcess()
← →
nexxiss (2004-05-21 16:04) [12]Спасибо за выдержки из SDK ( я сейчас за PC где Delphi отсутствует).
Так как мне корректно завершить работу моего App. ?
>при каких условиях и где ты вызываешь PostQuitMessage()
Тут вызывается PostQuitMessage():
WM_DESTROY:
begin
PostQuitMessage(0); // stop message loop
Result := 0;
Exit;
end;
← →
Digitman © (2004-05-21 16:27) [13]
> Так как мне корректно завершить работу моего App. ?
а мне почем знать, что у тебя там в "рендеринге" творится ?
очевидно, корректность завершения твоего процесса напрямую зависит от того, что ты там творишь ..
← →
WebErr © (2004-05-21 18:20) [14]Удалено модератором
Примечание: Offtopic
← →
nexxiss © (2004-05-22 01:05) [15]Все созданные мною объекты удаляются в обратном порядке и в итоге ничего не остается. Если проблема в этом заключается, то возможно я где-то что-то не досмотрел. Надо будет проверить код еще пару раз. В любом случае спасибо за беседу.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.05 c