Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi wait prozedur bewirkt vollständige cpu auslastung (https://www.delphipraxis.net/79483-wait-prozedur-bewirkt-vollstaendige-cpu-auslastung.html)

JonnyGuitar 23. Okt 2006 15:43


wait prozedur bewirkt vollständige cpu auslastung
 
tach zusammen,

ich benutze in einem service folgende wait prozedure:

Delphi-Quellcode:
procedure wait;
var
  res   : Cardinal;
  s     : String;
begin
  repeat
    Res := MsgWaitForMultipleObjects(2, hndlArr, false, 3600000, QS_ALLINPUT);

    if (Res = $ffffffff) then RaiseLastOSError;
    if Res = 1 then ForceUpdate := true;

    s := IntToStr(Res);
  until (Res = WAIT_OBJECT_0) or
        (Res = WAIT_TIMEOUT) or
        (Res = 1);
end;
diese schluckt aber leider 100% cpu last. was habe ich falsch gemacht?
ich hoffe einige leute haben verbesserungsvorschläge :)

ps: res = 1 tritt auf, wenn eins der beiden events aus dem handlearray ausgelöst werden

mfg Jonny

shmia 23. Okt 2006 17:20

Re: wait prozedur bewirkt vollständige cpu auslastung
 
Du hast den Code unterschlagen, der das Array hndlArr befüllt.
Hat der Service eine Benutzeroberfläche? Falls nicht, gibt es keinen Grund für QS_ALLINPUT.

TurboMartin 23. Okt 2006 17:48

Re: wait prozedur bewirkt vollständige cpu auslastung
 
Bringt in der Schleife viellecht ein Application.ProcressMessages was? :gruebel:

xaromz 23. Okt 2006 17:54

Re: wait prozedur bewirkt vollständige cpu auslastung
 
Hallo,
Zitat:

Zitat von TurboMartin
Bringt in der Schleife viellecht ein Application.ProcressMessages was? :gruebel:

Damit erhöhst Du die Auslastung nur noch. Nicht, dass das bei 100% noch möglich wäre :stupid: .

Gruß
xaromz

Klaus01 23. Okt 2006 18:41

Re: wait prozedur bewirkt vollständige cpu auslastung
 
Vielleicht bringt dich der folgende Thread ein wenig weiter?
Grüße
Klaus

JonnyGuitar 23. Okt 2006 19:12

Re: wait prozedur bewirkt vollständige cpu auslastung
 
servus,

also mein service hat keine oberfläche, und das hndlArr wird wie folgt befüllt:

Delphi-Quellcode:
hndlarr[0] := Event1.Handle;
hndlarr[1] := Event2.Handle;
den vorgeschlagene thread lese ich mir gleich mal durch.


mfg Jonny

JonnyGuitar 23. Okt 2006 19:15

Re: wait prozedur bewirkt vollständige cpu auslastung
 
kurzer nachtrag:

ich habe mir gerade den vorgeschlagenen thread von klaus durchgelesen, aber auch die folgende prozedur
Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
var
  Tick: DWord;
  Event: THandle;
begin
  Event := GetCurrentThread;
  Tick := GetTickCount + DWord(Milliseconds);
  while Milliseconds > 0 do
    case MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) of
      WAIT_TIMEOUT: Exit;
      WAIT_OBJECT_0: WriteLn('Fails');
    else
      begin
        Application.ProcessMessages;
        Milliseconds := Tick - GetTickcount;
      end;
    end;
end;
bringt 100% cpu auslastung

Klaus01 23. Okt 2006 20:43

Re: wait prozedur bewirkt vollständige cpu auslastung
 
Deine letzte Funktion bringt bei mir in einer Consolenanwendung auch 100% CPU Last.

Die folgende Funktion bringt bei eine CPU Last von 3-4%.

Delphi-Quellcode:

procedure Delay(Milliseconds: Integer);
{by Hagen Redmann}
var
  Tick: DWORD;
  Event: THandle;
begin
  Event := CreateEvent(nil, False, False, nil);
  try
    Tick := GetTickCount + DWORD(Milliseconds);
    while (Milliseconds > 0) and
      (MsgWaitForMultipleObjects(1, Event, False, Milliseconds,
      QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      Milliseconds := Tick - GetTickCount;
    end;
  finally
    CloseHandle(Event);
  end;
end;
Grüße
Klaus

JonnyGuitar 24. Okt 2006 08:17

Re: wait prozedur bewirkt vollständige cpu auslastung
 
moin klaus,

ich kann leider nicht in meinem service application.processmessages benutzen :(


mfg Jonny

Klaus01 24. Okt 2006 08:21

Re: wait prozedur bewirkt vollständige cpu auslastung
 
Nun, von Services habe ich keine Ahnung (hab' noch nie einen programmiert) deshalb jetzt
meine etwas dümmliche Frage: Geht es auch nicht wenn Du die Unit Forms einbindest?

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 Uhr.
Seite 1 von 2  1 2      

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