Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.04;
Скачать: CL | DM;

Вниз

Цикл обработки сообщений   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2004.07.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.057 c
1-1087380796
Игорь
2004-06-16 14:13
2004.07.04
Какой смысл указывать атрибуты файлов в FindFirst?


1-1087393539
sashuly
2004-06-16 17:45
2004.07.04
передача параметра при создании формы


14-1087350281
Думкин
2004-06-16 05:44
2004.07.04
С днем рождения! 16 июня


4-1085303364
ГудБой
2004-05-23 13:09
2004.07.04
Как программно сделать Sussped? NTReboot;


4-1085130251
_shark_
2004-05-21 13:04
2004.07.04
Уважаемые мастера подскажите плиз, сервис грузится до входа в