Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi CPU Auslastung eines Delphi-Programms drosseln (https://www.delphipraxis.net/152236-cpu-auslastung-eines-delphi-programms-drosseln.html)

Delphiuser1987 16. Jun 2010 08:17

Delphi-Version: 2010

CPU Auslastung eines Delphi-Programms drosseln
 
Hi,

ich brauch mal wieder Hilfe von euch.
Ich habe ein Programm geschrieben das ständig durchläuft bis es abgebrochen wird. dazu habe ich eine while Schleife verwendet.
Es funktioniert auch ohne Probleme. Das einzige Problem dass ich habe ist, dass die CPU Auslastung bei 100% liegt.
Das ist für mich auch logisch, das Programm läuft halt so schnell durch, wie der Prozessor kann.
Jetzt zu meiner Frage: Gibt es eine Möglichkeit das Programm nur Taktweise jede paar Millisekunden durlaufen zu lassen, bzw. gibt es einen extra Baustein dafür.
Wäre für eure Hilfe sehr dankbar.
Aber bis jetzt habt ihr mich ja noch nie enttäuscht :thumb::-D

s.h.a.r.k 16. Jun 2010 08:19

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Bau halt ein
Delphi-Quellcode:
Sleep(<Zeit in Millisekunden>);
ein. So lange wird an der entsprechenden Stelle dann gewartet. Das dürfte den CPU-Durst etwas senken :mrgreen:

SirThornberry 16. Jun 2010 08:20

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Aus welchem Grund willst du das Programm drosseln? Ist es nicht gewünscht das dein Programm schnellst möglich arbeitet? Wenn dich stört das andere Programm während dieser Zeit weniger Rechenzeit abbekommen kannst du die Priorität deines Prozesses herab setzen. Allerdings läuft das Programm dann auch weiter mit 100% Auslastung mit dem Unterschied das andere Programm, wenn nötig mehr Rechenzeit bekommen.
Ohne zu wissen warum du die Geschwindigkeit des Programmes drosseln willst wird es schwer dir den richtigen Tipp zu geben.

Tonic1024 16. Jun 2010 08:36

AW: CPU Auslastung eines Delphi-Programms drosseln
 
IMO ist es nicht immer sinnvoll, dass ein Programm "schnellstmöglichst" arbeitet. Eine Watchdog Routine arbeitet vielleicht genau so gut wenn sie im 1.000ms oder 10.000ms Takt läuft. warum also die CPU künstlich belasten?

Delay

Das hier könnte helfen. Delay lässt den Thread "schlafen" ohne dass die App einfriert. Andere Threads arbeiten wie gewohnt weiter.

Gruß,

Toni

Delphiuser1987 16. Jun 2010 09:26

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Das Programm wird auf einem Pc mit Atom-Prozessor verwendet.
Auf diesem laufen noch anderere Programme, die schon 30% Auslastung haben.
Wenn jetzt noch mein Programm läuft, funktioniert fast nichts mehr.
Das ist der Grund !

himitsu 16. Jun 2010 09:28

AW: CPU Auslastung eines Delphi-Programms drosseln
 
bei 1.000 oder 10.000 könnte man auch gleich einen Timer verwenden ... wozu da erst einen weiteren "rießigen" Thread laufen lassen, welchen das System auch noch verwalten muß.

jfheins 16. Jun 2010 09:28

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Schreibe mal in die Schleife ein
Delphi-Quellcode:
Sleep(0)
das bewirkt, dass die anderen Anwendungen (falls vorhanden) mehr Rchenzeit bekommen.

himitsu 16. Jun 2010 09:31

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Zitat:

Zitat von jfheins (Beitrag 1029234)
das bewirkt, dass die anderen Anwendungen (falls vorhanden) mehr Rchenzeit bekommen.

etwas anders:

Jeder Thread bekommt nacheinander Zeitfenster von ein paar Millisekunden, um zu arbeiten ... Sleep(0) gibt die Verarbeituing aber sofort ab, verkürzt damit das eigene Zeitfenster und andere Threadsa kommen somit früher/schneller wieder dran.
Aber über "längere" Zeit stimmt es quasi doch ... eigene Zeit verkürzt = für andere länger.

Um wieviel soll denn dein Programm gedrosselt werden?
Bzw. was macht denn dein Programm nun ... vielleicht kann man dieses ja anderes/optimaler lösen.
Sleep(10) bewirkt da schon sehr viel.

mkinzler 16. Jun 2010 09:34

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Hat Sleep() bei älteren Delphiversionen nicht aktiv gewartet?

SirThornberry 16. Jun 2010 09:34

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Zitat:

Zitat von Delphiuser1987 (Beitrag 1029231)
Wenn jetzt noch mein Programm läuft, funktioniert fast nichts mehr.Das ist der Grund !

Wenn das der Grund ist setze einfach die Priorität deines Prozesses herab.

jfheins 16. Jun 2010 09:47

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Zitat:

Zitat von mkinzler (Beitrag 1029242)
Hat Sleep() bei älteren Delphiversionen nicht aktiv gewartet?

Was meinst du mit "aktiv gewartet" ?

Sleep() ruft nur die entsprechende Windowsfunktion auf. Unmd die sorgt dafür, dass dem Thread die nächsten x Millisekunden keine Rechenzeit zugewiesen wird. Wenn man also Sleep(1000) aufruft, friert der Thread für 1 Sekunde ein, weil er keine Rechenzeit mehr bekommt. (dafür sorgt der Scheduler voin Windows)
Ein Sleep(0) erscheint damit im ersten Moment sinnlos. Es sorgt aber dafür, dass der Thread sofort von der CPU genommen wird und hinten in die Warteschlange kommt. Also die Abarbeitung wird vorzeitig abgebrochen und der nächste Thread kommt an die Reihe.

Bummi 16. Jun 2010 09:53

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Ein anderer Vorschlag
Delphi-Quellcode:
uses Tlhelp32;

{$R *.dfm}
function getPid(const name: string): integer;
  var
    hProcSnap: THandle;
    pe32: TProcessEntry32;
begin
    result:= 0;
    hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
    if hProcSnap = INVALID_HANDLE_VALUE then exit;
    pe32.dwSize := SizeOf(ProcessEntry32);
    if Process32First(hProcSnap, pe32) = true then
       while Process32Next(hProcSnap, pe32) = true do
       begin
        if lowerCase( pe32.szExeFile) = name then
        begin
         result:= pe32.th32ProcessID;
         break;
        end;
       end;
    CloseHandle(hProcSnap);
end;

Procedure SetProcessPriority(const fn:String;Priority:Integer);
{IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS , HIGH_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS}
var
   newhandle:Thandle;
begin
    newhandle := OpenProcess(PROCESS_SET_INFORMATION, false, getPid(fn));
    setpriorityclass(newhandle, Priority);
    CloseHandle(newhandle);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
   SetProcessPriority(Lowercase(ExtractFileName(Application.ExeName)),IDLE_PRIORITY_CLASS);
end;

Tonic1024 16. Jun 2010 11:00

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Zitat:

Zitat von himitsu (Beitrag 1029232)
bei 1.000 oder 10.000 könnte man auch gleich einen Timer verwenden ... wozu da erst einen weiteren "rießigen" Thread laufen lassen, welchen das System auch noch verwalten muß.

Durch MsgWaitForMultipleObjects() wird IMO auch nur der aktuelle Thread schlafen gelegt. Ein bischen wie ein Sleep() mit Message Queue. Und wenn er schon ein funktionierendes Programm hat, das halt schon mit ner Schleife arbeitet, ist er mit der Delay-Funktion schnell fertig. Viele Wege führen nach Rom. Und "besser" ist halt auch ne Standpunkt-Frage.

Toni

SirThornberry 16. Jun 2010 11:06

AW: CPU Auslastung eines Delphi-Programms drosseln
 
@Bummi: Warum so kompliziert. Nimm doch einfach GetCurrentProcess

Bummi 16. Jun 2010 11:29

AW: CPU Auslastung eines Delphi-Programms drosseln
 
@SirThornberry

stimmt in diesem Fall ....

der Fetzen Code stammte aus einer Anwendung die eigentlich Fremde Prozesse umpriorisiert.

sorry ...

Delphiuser1987 16. Jun 2010 12:07

AW: CPU Auslastung eines Delphi-Programms drosseln
 
danke Leute, Sleep(50) hat funktioniert.
Vorher 100% jetzt 11%.
Auf euch ist halt verlass :thumb::-D
Bis zum nächsten Mal :wink:

Gruß

Ralf Kaiser 17. Jun 2010 07:02

AW: CPU Auslastung eines Delphi-Programms drosseln
 
Zitat:

Zitat von mkinzler (Beitrag 1029242)
Hat Sleep() bei älteren Delphiversionen nicht aktiv gewartet?

Aus Sysutils.pas:

Delphi-Quellcode:
{$IFDEF MSWINDOWS}
procedure Sleep; external kernel32 name 'Sleep'; stdcall;
{$ENDIF}
Sleep() ist also aus dem Windows-API und sollte daher in allen Delphi-Versionen gleich funktionieren.


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