Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.49 MB
Время: 0.033 c
3-1086787916
Ditrix
2004-06-09 17:31
2004.07.04
использование cdx файлов


1-1087563976
Vadim
2004-06-18 17:06
2004.07.04
Код символа


1-1087908262
BFG9k
2004-06-22 16:44
2004.07.04
Количество дочерних компонентов


3-1086671890
Litr
2004-06-08 09:18
2004.07.04
Запрос с iif


1-1087889457
Apolon
2004-06-22 11:30
2004.07.04
MDI





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский