Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 10:57 Uhr.
Seite 2 von 2     12   

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