AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi wait prozedur bewirkt vollständige cpu auslastung
Thema durchsuchen
Ansicht
Themen-Optionen

wait prozedur bewirkt vollständige cpu auslastung

Ein Thema von JonnyGuitar · begonnen am 23. Okt 2006 · letzter Beitrag vom 24. Okt 2006
Antwort Antwort
Seite 2 von 2     12   
JonnyGuitar

Registriert seit: 4. Jun 2004
233 Beiträge
 
#11

Re: wait prozedur bewirkt vollständige cpu auslastung

  Alt 24. Okt 2006, 09:23
habe ich gerade versucht, dass geht *g*. aber leider bringt der code:

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(2, hndlArr, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      Milliseconds := Tick - GetTickCount;
    end;
  finally
// CloseHandle(Event);
  end;
end;
auch wieder volle cpu auslastung


mfg Jonny
the only thing to fear is runnin' out of beer
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

Re: wait prozedur bewirkt vollständige cpu auslastung

  Alt 24. Okt 2006, 09:29
Ruf doch einfach mal in deinem ursprüngluichen Code Sleep(1) auf.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
JonnyGuitar

Registriert seit: 4. Jun 2004
233 Beiträge
 
#13

Re: wait prozedur bewirkt vollständige cpu auslastung

  Alt 24. Okt 2006, 09:39
moin luckie,

trotz sleep(1) immer noch volle cpu auslastung...


mfg Jonny
the only thing to fear is runnin' out of beer
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#14

Re: wait prozedur bewirkt vollständige cpu auslastung

  Alt 24. Okt 2006, 09:46
Zwei Fragen:
1. Rufst du die Routine in einem Thread auf?
2. Warum gibst du in einem Beispiel den aktuellen Thread (GetCurrentThread) als das Objekt an, auf das gewartet werden soll?
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#15

Re: wait prozedur bewirkt vollständige cpu auslastung

  Alt 24. Okt 2006, 09:49
@Jonny:

Ist das noch der gleiche Code den du verwendest ? Nein: du kommentierst Zeilen aus die die Funktion vollständig verändern.

Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
{by Hagen Reddmann}
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;
So funktioniert das wunderprächtig, in einem normalem Prozess wie angedacht. Das Event so zu benutzen ist essentiell, es ist nämlich ein niemals signalsierendes Event und darauf baut der Code aktiv auf.

Willst du das abändern dann unter 4 Bedingungen:

Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
var
  Tick: DWORD;
begin
  Tick := GetTickCount + DWORD(Milliseconds);
  while Milliseconds > 0 do
  begin
    case WaitForMultipleObjects(2, hndlArr, False, Milliseconds, QS_ALLINPUT) of
      WAIT_OBJECT_0 +0 :
        begin
          // Event Nummer 1 signalisiert
        end;
      WAIT_OBJECT_1 +1 :
        begin
          // Event Nummer 2 signalisiert
        end;
      WAIT_TIMEOUT:
        begin
          // nothing todo
          Exit;
        end;
    else
      begin
        // Fehler !!
      end;
    end;
    Milliseconds := Tick - GetTickCount;
  end;
end;
1.) ein Service wie deiner hat keinen Message Queue
2.) MsgWaitFor...() benötigt einen Message Queue, ergo wird WaitForMultipleObjects() benutzt
3.) du musst bei vorzeitiger Rückkehr von WaitFor..() auch die signalisierenden Events abprüfen. Besonders wenn diese Events sich nur manuell zurücksetzen lassen. Du hast ja eben nichts darüber ausgesagt was für Events das sind und wie sie signalisiert/resetet werden
4.) überpüfe nun ob der obige Code permanent in WAIT_OBJECT_0 oder WAIT_OBJECT_0 +1 rein springt. Sollte dies der Fall sein so ist dein Event Handling falsch. Eventuell musst du die Event mit ResetEvent() zurücksetzen.

Alles in allem kann ich dir garantieren das wenn die Events korrekt benutzt werden die CPU Auslastung entsprechend der Häufigkeit des Auslösens der Events absinken wird. Sind diese natürlich permanent signalisiert so beträgt die CPU Auslastung auch 100%.

Der obige Code ist dermaßen trivial das ein Fehler auszuschließen ist. Wenn also die CPU Auslastung immer noch 100% ist so wird es mit großer Wahrscheinlichkeit ein Fehler in deinem restlichen Code sein (den wir ja nicht kennen).

Gruß Hagen
  Mit Zitat antworten Zitat
JonnyGuitar

Registriert seit: 4. Jun 2004
233 Beiträge
 
#16

Re: wait prozedur bewirkt vollständige cpu auslastung

  Alt 24. Okt 2006, 10:20
so, mit dem letzten code klappt alles hervorragend,

jedoch sind noch 3 veränderungen zu machen:

Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
var
  Tick: DWORD;
begin
  Tick := GetTickCount + DWORD(Milliseconds);
  while Milliseconds > 0 do
  begin
    case WaitForMultipleObjects(2, @hndlArr, False, Milliseconds) of
      WAIT_OBJECT_0 +0 :
        begin
          // Event Nummer 1 signalisiert
        end;
      WAIT_OBJECT_0 +1 :
        begin
          // Event Nummer 2 signalisiert
        end;
      WAIT_TIMEOUT:
        begin
          // nothing todo
          Exit;
        end;
    else
      begin
        // Fehler !!
      end;
    end;
    Milliseconds := Tick - GetTickCount;
  end;
end;
so liet die prozessorauslastung bei 0% und ich bin glücklich.

vielen dank an alle

mfg Jonny
the only thing to fear is runnin' out of beer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 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