CPU Auslastung festlegen



  • Hallo allesamt!

    Sagt mal, gibt es eine Möglichkeit festzulegen, dass meine Anwendung nicht mehr als maximal 20% der CPU Auslastung in Anspruch nimmt?
    Meine Anwendung ließt und schreibt Dateien im hintergrund. Während so eine Datei entweder gelesen oder geschrieben wird ist die CPU Auslastung bei 100% und man kann nebenher nichts mehr machen. Deshalb würde ich gerne irgendetwas unternehmen, dass mein Programm nicht mehr als 20% des Prozessors in Anspruch nimmt bzw. alle anderen Programme nicht durch meins behindert werden. Das dadurch mein Programm langsamer wird ist egal, da es im Hintergrund laufen soll.

    Schon mal danke…



  • Prozentual lässt sich das nicht festlegen, du kannst Windows lediglich mitteilen, dass dein Programm bei der Verteilung von Rechenzeit gerne anderen den Vortritt lässt.

    int oldPriorityClass, oldPriority;
    
      oldPriorityClass = GetPriorityClass(GetCurrentProcess);
      oldPriority = GetThreadPriority(GetCurrentThread);
    
      SetPriorityClass(GetCurrentProcess,               // Priorität ändern
                       IDLE_PRIORITY_CLASS);
      SetThreadPriority(GetCurrentThread,
                        THREAD_PRIORITY_IDLE);
    
      // hier dein mit geringer Priorität auszuführender Code
    
      SetThreadPriority(GetCurrentThread, oldPriority); // Priorität zurücksetzen
      SetPriorityClass(GetCurrentProcess, oldPriorityClass);
    

    Sieh dir in der Hilfe zu SetThreadPriority bzw. SetPriorityClass an, welche Abstufungen möglich sind.



  • Danke!



  • Noch so ne keine Frage...

    Wie kann ich den Thread für SetThreadPriority mit dem THREAD_SET_INFORMATION access right öffnen? So etwas wie OpenThread gibt es ja nicht.



  • Das brauchst du nicht, GetCurrentThread etc. bezieht sich ja auf dein Programm und das hat dieses Recht per default.



  • Eigentlich dachte ich auch, dass mein Programm dieses Access Right besitzt. Die Praxis sieht aber anders aus. Ich benutze Windows XP mit ServicePack 2.

    void __fastcall TfrmMain::FormCreate(TObject *Sender)
    {
      HANDLE phWnd   = OpenProcess(PROCESS_SET_INFORMATION,false,GetCurrentProcessId());
    
      if (phWnd   == 0) ShowMessage("Cannot open process!");
    
      if (SetPriorityClass(phWnd,IDLE_PRIORITY_CLASS) == 0)
        ShowMessage("Cannot adjust the Priority Class!");
      if (SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_IDLE) == 0)
        ShowMessage("Cannot adjust the Thread's Priority!");
    
      CloseHandle(phWnd);
    }
    

    Die SetPriorityClass - Funktion funktioniert so richtig. Beim Versuch die Priorität des Threads zu verändern, kommt es zu der Fehlermeldung.


Anmelden zum Antworten