Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Win32 API: Nachrichtenschleife und 100% CPU Auslastung (https://www.delphipraxis.net/31915-win32-api-nachrichtenschleife-und-100-cpu-auslastung.html)

Nonsense 15. Okt 2004 15:25


Win32 API: Nachrichtenschleife und 100% CPU Auslastung
 
Hallo,

durch folgende Nachrichtenschleife habe ich eine CPU-Auslastung von 100%:
Delphi-Quellcode:
  while not Finished do
    if (PeekMessage(Msg, 0, 0, 0, PM_REMOVE)) then
      if (Msg.Message = WM_QUIT) then
      begin
        Finished := True;

        [ ... (Instanzen freigeben etc.) ]
      end else
      begin
     TranslateMessage(Msg);
        DispatchMessage(Msg);
      end
    else
      ProcessKeys; // Tastatureingaben verarbeiten
PeekMessage könnte ich durch GetMessage ersetzen und das Freigeben von Instanzen kann ich dann in's WM_DESTROY tun. Nur wo schiebe ich dann mein ProcessKeys rein?
Hat jemand eine Alternative für mich?

Thx.

neolithos 15. Okt 2004 15:29

Re: Win32 API: Nachrichtenschleife und 100% CPU Auslastung
 
WaitMessage nach ProcessKey rufen?

Union 15. Okt 2004 15:37

Re: Win32 API: Nachrichtenschleife und 100% CPU Auslastung
 
Zitat:

Zitat von Nonsense
Hallo,

durch folgende Nachrichtenschleife habe ich eine CPU-Auslastung von 100%:
Delphi-Quellcode:
  while not Finished do
    if (PeekMessage(Msg, 0, 0, 0, PM_REMOVE)) then
      if (Msg.Message = WM_QUIT) then
      begin
        Finished := True;

        [ ... (Instanzen freigeben etc.) ]
      end else
      begin
     TranslateMessage(Msg);
        DispatchMessage(Msg);
      end
    else
      ProcessKeys; // Tastatureingaben verarbeiten
PeekMessage könnte ich durch GetMessage ersetzen und das Freigeben von Instanzen kann ich dann in's WM_DESTROY tun. Nur wo schiebe ich dann mein ProcessKeys rein?
Hat jemand eine Alternative für mich?

Thx.

Was macht denn ProcessKeys ? Normalerweise sollte das ein if Msg.Message = WM_KEY... gefolgt von einem case sein.

Nonsense 15. Okt 2004 16:36

Re: Win32 API: Nachrichtenschleife und 100% CPU Auslastung
 
Zitat:

Zitat von neolithos
WaitMessage nach ProcessKey rufen?

Jo, Danke!

Meine ProcessKeys Prozedur ist zum verarbeiten der Tastatur-Eingaben zuständig:
Delphi-Quellcode:
procedure ProcessKeys;
begin
  if Keys[VK_RETURN] then Started := True;
  if Keys[VK_ESCAPE] then Finished := True;

  [ etc. ]
end;
verbunden mit WM_KEYDOWN und WM_KEYUP:
Delphi-Quellcode:
    WM_KEYDOWN:
      begin
        Keys[wParam] := True;
        Result := 0;
      end;
    WM_KEYUP:
      begin
        Keys[wParam] := False;
        Result := 0;
      end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz