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.