Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Rechenzeit zurückgeben (https://www.delphipraxis.net/51163-rechenzeit-zurueckgeben.html)

gbl 7. Aug 2005 15:06


Rechenzeit zurückgeben
 
Hallo,

Ich programmiere gerade einen Dienst. Leider verbaucht der Dienst auch 100% CPU Zeit. In einer GUI Anwendung kann ich mit
Delphi-Quellcode:
  App.ProcessMessages;
die Rechenzeit an das System zurückgeben.
Leider steht mir die Klasse App in meiner Anwendung nicht zur Vverfügung.

Der Relevante Codeteil:
Delphi-Quellcode:
procedure ProcessMessages(hWnd: DWORD);
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, hWnd, 0, 0, PM_REMOVE) do
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
end;

PROCEDURE SERVICE_MAIN;
BEGIN
  REPEAT
    IF NOT paused THEN
    BEGIN
      ProcessMessages(0);

      if SecondsBetween(time, time0)>=timedelta then
      begin
        Windows.Beep(2000, 250);
        time0:=time;
      end;
    END;
  UNTIL stopped;
END;
Mir ist klar, daß das Handle 0 nicht gültig ist. Hat jemand eine Idee wie ich die CPU Zeit runter bekomme?

Joachim Rohde 7. Aug 2005 15:46

Re: Rechenzeit zurückgeben
 
Das liegt an der PeekMessage-Funktion. Kannst du nicht die GetMessage-Funktion verwenden?

MaBuSE 8. Aug 2005 06:16

Re: Rechenzeit zurückgeben
 
Zitat:

Zitat von Joachim Rohde
Das liegt an der PeekMessage-Funktion. Kannst du nicht die GetMessage-Funktion verwenden?

Borland verwendet aber auch diese Funktion ;-)
(Und zwar mit einer konstanten 0 wo gbl hWnd (Parameter = 0) benutzt.)

Quelltextauszug aus Forms.pas:
Delphi-Quellcode:
{*******************************************************}
{                                                       }
{       Borland Delphi Visual Component Library        }
{                                                       }
{  Copyright (c) 1995-2002 Borland Software Corporation }
{                                                       }
{*******************************************************}
...
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
  Handled: Boolean;
begin
  Result := False;
  if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
  begin
    Result := True;
    if Msg.Message <> WM_QUIT then
    begin
      Handled := False;
      if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
      if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
        not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end
    else
      FTerminate := True;
  end;
end;

procedure TApplication.ProcessMessages;
var
  Msg: TMsg;
begin
  while ProcessMessage(Msg) do {loop};
end;
...

gbl 8. Aug 2005 07:12

Re: Rechenzeit zurückgeben
 
Danke vorerst Euch beiden.

Ich habe eine Workarrount für mein Problem gefunden. Im Sinne des Befehles SLEEP sage ich dem Programm einfach nichts zu tun. Für meine Zwecke reicht es.

Delphi-Quellcode:
PROCEDURE SERVICE_MAIN;
BEGIN
  REPEAT
    IF NOT paused THEN
    BEGIN
      sleep(10);

      if SecondsBetween(time, time0)>=timedelta then
      begin
        Windows.Beep(2000, 250);
        time0:=time;
      end;
    END;
  UNTIL stopped;
END;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 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