Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CPU-Auslastung minimieren (https://www.delphipraxis.net/130736-cpu-auslastung-minimieren.html)

Carsten1234 12. Mär 2009 11:12


CPU-Auslastung minimieren
 
Hallo,

lt. Taskmanager hat mein Programm, wenn es einfach nur gestartet wird und noch "nix" macht, eine CPU-Auslastung von 50% (diese geht auf 0, wenn das Programm minimiert wird).
Frage: Kann man die CPU-Auslastung noch irgendwie "händisch" herunter setzen?
Im Quellcode selbst habe ich schon stehen:
Delphi-Quellcode:
procedure TTMSMainForm.FormCreate(Sender: TObject);
var MainThread: THandle;
begin
  MainThread := GetCurrentThread;
  SetThreadPriority(MainThread, THREAD_PRIORITY_LOWEST);
  Application.OnIdle:= AppUpdate;
end;

procedure TMainForm.AppUpdate(Sender: TObject; var Done: Boolean);
begin
  inherited;
  Application.ProcessMessages;
(...)
end;
Bringt aber auch nichts...

Dank vorab und Gruß, Carsten

Luckie 12. Mär 2009 11:29

Re: CPU-Auslastung minimieren
 
Das brint natürlich nichts. Die Priorität wirkt sich nur darauf aus, wie oft dein Thread oder Prozess Rechenzeit zugeteilt bekommt. Aber was hast du gegen die 50%? So lange der Prozess die Rechenzeit abgibt, wenn sie von anderen Prozessen benötigt wird, ist das doch in Ordnung.

himitsu 12. Mär 2009 11:30

Re: CPU-Auslastung minimieren
 
Wann/wo wird AppUpdate aufgerufen?

Und was macht deine Anwendung eigentlich?
(ihre Oberfläche ständig neu zeichen, oder wie)

nahpets 12. Mär 2009 11:35

Re: CPU-Auslastung minimieren
 
Hallo,
Zitat:

Zitat von himitsu
Wann/wo wird AppUpdate aufgerufen?

Und was macht deine Anwendung da eigentlich?
(ihre Oberfläche ständig neu zeichen, oder wie)

das Programm muss irgendwas aktiv machen, sonst gibt es bei Delphiprogrammen keine derartige CPU-Belastung. Ein Programm, das nichts tut, hat eine CPU-Belastung von 0%.

Erzähl' uns mal, was für ein Programm das ist, eventuell kommen wir dem Phänomen ja dann auf die Schliche.

jfheins 12. Mär 2009 12:02

Re: CPU-Auslastung minimieren
 
Zitat:

Zitat von Carsten1234
Delphi-Quellcode:

  Application.OnIdle:= AppUpdate;

procedure TMainForm.AppUpdate(Sender: TObject; var Done: Boolean);
begin
  inherited;
  Application.ProcessMessages;
(...)
end;

Sobald die Anwendung nichts zu tun hat, sagst du ihr, sie soll gefälligst nachsehen, ob sie nicht doch etwas zu tun hat :stupid:

Schmeiß das Application.Processmessages da raus - denn wenn OnIdle aufgerufen wird, ist klar dass es keine Nachrichten gibt, die verarbeitewt werden können ;)

Btw.: was hast du durch die (...) abgekürzt? Das könnte eventuell auch noch den Prozessor auslasten ...

Carsten1234 12. Mär 2009 12:10

Re: CPU-Auslastung minimieren
 
Zitat:

Zitat von nahpets
Erzähl' uns mal, was für ein Programm das ist, eventuell kommen wir dem Phänomen ja dann auf die Schliche.

Das Programm kommuniziert über einen virt. COMPort-Treiber mit einem via USB angesteckten Gerät. Zwar gibt es im Programm div. Timer, diese werden aber definitiv erst dann aktiv, wenn sich der Anwender mit dem Gerät verbunden hat. Bis dato ist es quasi im Ruhezustand, sofern man bei einer CPU-Last von 50% diese Aussage treffen kann.
Zum Einsatz kommen neben div. Delphi-Komponenten noch für die Oberfläche div. (optische) Komponenten von TMS und für die Kommunikation über die serielle Schnittstelle TApdCOMPort von AsyncPro. Mehr ist da nix.

Zitat:

Zitat von himitsu
Wann/wo wird AppUpdate aufgerufen?

Und was macht deine Anwendung eigentlich?
(ihre Oberfläche ständig neu zeichen, oder wie)

AppUpdate wird im Idle-Process aufgerufen. Und was die Anwendung da macht, würde ich auch gerne wissen. :mrgreen:
Ein Invalidate findet von meiner Seite aus nicht statt.

Gruß, Carsten

Carsten1234 12. Mär 2009 12:20

Re: CPU-Auslastung minimieren
 
Zitat:

Zitat von jfheins
Sobald die Anwendung nichts zu tun hat, sagst du ihr, sie soll gefälligst nachsehen, ob sie nicht doch etwas zu tun hat :stupid:

Bringt nix.


Zitat:

Zitat von jfheins
Btw.: was hast du durch die (...) abgekürzt? Das könnte eventuell auch noch den Prozessor auslasten ...

Auf der Oberfläche befindet sich eine Gerätestatusanzeige.
Hierbei bedeutet:
rotes Lämpchen = kein Gerät vorhanden
gelbes Lämpchen = Gerät da, Status (Bereitschaft) unbekannt
grünes Lämpchen = Gerät da und bereit zur Kommunikation

In einer separaten Schnittstellen-Unit (-Klasse) gibt es ein entsprechendes Property (DEVICE_OFF, DEVICE_UNKNOW, DEVICE_OK).
In der AppUpdate wird lediglich der Status des Property abgefragt, mehr nicht, und das sieht dann wie folgt aus:
Delphi-Quellcode:
case COMInterface.DeviceState of
    DEVICE_OFF:
      AdvDeviceGlowButton.Picture.LoadFromResourceName(HInstance, 'DEVICE_BUSY');
    DEVICE_OK :
      AdvDeviceGlowButton.Picture.LoadFromResourceName(HInstance, 'DEVICE_OK');
    DEVICE_UNKNOWN:
      AdvDeviceGlowButton.Picture.LoadFromResourceName(HInstance, 'DEVICE_UNKNOWN');
  end;
[5min später]

Jau, wenn ich die case-Anweisung ausklammere, dann ist die CPU-Last auf 0% im Ruhezustand. Jetzt ist die Frage, ob der TAdvDeviceGlowButton oder das LoadFromRessourceName der Übeltäter ist. :gruebel:

himitsu 12. Mär 2009 12:34

Re: CPU-Auslastung minimieren
 
Dann leg das vom OnIdle in einen Timer.

OnIdle wird ja aufgerufen, wenn der PC nix zu tun hat ... also zumindestens wären diese 50% dann nicht schlimm, da wenn der PC andersweitig ausgelastet ist, dann dein OnIdle (gar)nicht aufgerufen wird :zwinker:

Carsten1234 12. Mär 2009 12:40

Re: CPU-Auslastung minimieren
 
Zitat:

Zitat von himitsu
Dann leg das vom OnIdle in einen Timer.

OnIdle wird ja aufgerufen, wenn der PC nix zu tun hat ... also zumindestens wären diese 50% dann nicht schlimm, da wenn der PC andersweitig ausgelastet ist, dann dein OnIdle (gar)nicht aufgerufen wird :zwinker:

Zwischenzeitlich schon gemacht. Die CPU-Last liegt jetzt lt. Taskmanager bei 1%. :dancer2:
Dank an alle nochmal an dieser Stelle.

mr_emre_d 12. Mär 2009 12:55

Re: CPU-Auslastung minimieren
 
Du könntest auch beim OnIdle bleiben!

Hau dazu einfach ein Sleep rein!

Sleep(10) müsste die Auslastung senken!

MfG


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