Ich habe das Gefühl du bist durch Herumprobieren auf diese Schleife gekommen, die dir CustomAffinity berechnet.
Hier mal eine einfachere Version davon, die auch bis 64 Bit arbeitet und auch nur die benötigten Rechte nutzt.
Code: Alles auswählen
EnableExplicit
#PROCESS_SET_INFORMATION = $0200
Procedure setzeCPUKerne(PID.i, benutzeKerne.i)
Protected customAffinity.q = (1 << benutzeKerne) - 1
If (benutzeKerne = 64)
customAffinity = -1
EndIf
;Anzahl der Kerne setzen
pH = OpenProcess_(#PROCESS_SET_INFORMATION, #False, PID)
SetProcessAffinityMask_(ph, customAffinity)
CloseHandle_(ph)
EndProcedure
Leider achtet der Code aber noch nicht darauf welche Prozessoren wirklich gesetzt werden dürfen. Eine Auflistung möglicher Prozessoren gibt die Funktion
GetProcessAffinityMask_() zurück. Deswegen immer besser mal die Anleitung auf der MSDN lesen.
Und wegen deiner MHz-Frage: Das ist wohl kaum möglich, da üblicherweise Prozessoren nur bestimmte festgelegte Taktfrequenzen besitzen und nicht darunter gehen können. Die möglichen Taktfrequenzen für meinen Laptop sind zum Beispiel: 2.70 GHz, 2.60 GHz, 2.50 GHz, 2.40 GHz, 2.30 GHz, 2.20 GHz, 2.10 GHz, 1.90 GHz, 1.80 GHz, 1.70 GHz, 1.60 GHz, 1.50 GHz, 1.40 GHz, 1.30 GHz und 1.20 GHz. Ich kann also auf minimal 1200 MHz herunter takten, was momentan sowieso der Fall ist, weil ich nur im Netz surfe. Aber wenn es weniger werden soll, braucht man entweder eine Lastschleife, oder man installiert sich für alte Anwendungen entsprechende virtuelle Maschinen, die man dann herunter takten kann und die das eventuell eleganter machen als mit einer Lastschleife.