Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Цикл обработки сообщений [D7, WinME, Win2k, WinXP]


nexxiss ©   (2004-05-21 13:39:00) 

Добрый день. У меня возник следующий вопрос:
Как правильно организовать обработку сообщений с помощью функции PeekMessage ?
С GetMessage все корректно работает, а вот с PeekMessage после завершения работы приложение "не умирает до конца". Я был бы благодарен, если кто-нибудь приведет пример этого цикла.


nexxiss   (2004-05-22 01:05:00) [1]

Все созданные мною объекты удаляются в обратном порядке и в итоге ничего не остается. Если проблема в этом заключается, то возможно я где-то что-то не досмотрел. Надо будет проверить код еще пару раз. В любом случае спасибо за беседу.


WebErr   (2004-05-21 18:20:00) [2]

Удалено модератором
Примечание: Offtopic


Digitman   (2004-05-21 16:27:00) [3]


> Так как мне корректно завершить работу моего App. ?


а мне почем знать, что у тебя там в "рендеринге" творится ?
очевидно, корректность завершения твоего процесса напрямую зависит от того, что ты там творишь ..


nexxiss   (2004-05-21 16:04:00) [4]

Спасибо за выдержки из SDK ( я сейчас за PC где Delphi отсутствует).
Так как мне корректно завершить работу моего App. ?

>при каких условиях и где ты вызываешь PostQuitMessage()

Тут вызывается PostQuitMessage():

   WM_DESTROY:
     begin
       PostQuitMessage(0); // stop message loop
       Result := 0;
       Exit;
     end;


Digitman   (2004-05-21 15:49:00) [5]

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 15:39:00) [6]

На мой взгляд использовать цикл с 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:38:00) [7]

На мой взгляд использовать цикл с 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:26:00) [8]

а зачем тебе их , действия, чаще делать ?

ты строишь анимационные кадры ? выноси циклический рендеринг в доп.код.поток, после построения очер.кадра доп.поток шлет сообщение осн.потоку, указывая на данные только что построенной сцены .. основной поток крутится в цикле while GetMessage() do .. получив от доп.потока сообщение, осн.поток забирает эти данные и визуализирует их


nexxiss   (2004-05-21 15:09:00) [9]

>что происходит после выхода из цикла по условию получения WM_QUIT ?

Прерывается цикл обработки сообщений, и приложение заканчивает работу.

>чем оправдано использование PeekMessage() ? в каком контексте этот цикл используется ?

>имелось ввиду - почему не использован цикл с GetMessage или почему не использован тот же Application.Run ?


На сколько я понимаю, в этом случае "мои действия" происходят независимо: в очереди сообщений есть или нет, значит они ( действия) будут повторятся чаще ( чего, собственно, и хочется), или я в чем то ошибаюсь ?


Digitman   (2004-05-21 14:36:00) [10]


> Вместо многоточия происходит рендеринг сцены


а это здесь при чем ?

имелось ввиду - почему не использован цикл с GetMessage или почему не использован тот же Application.Run ?

что происходит после выхода из цикла по условию получения WM_QUIT ?


nexxiss   (2004-05-21 14:22:00) [11]

Вместо многоточия происходит рендеринг сцены.


Digitman   (2004-05-21 14:19:00) [12]


> nexxiss


чем оправдано использование PeekMessage() ? в каком контексте этот цикл используется ?


nexxiss   (2004-05-21 14:16:00) [13]

Вот так это выглядит у меня:

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;


Игорь Шевченко   (2004-05-21 14:09:00) [14]

RTFS: Forms.pas TApplication.Run


panov   (2004-05-21 13:47:00) [15]

Ты бы привел свой пример, всё должно работать...


Наверх

Титульная страница Поиск, карта сайта Написать письмо