1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| { TCPU }
constructor TCPU.Create;
begin
// Initialisation des structures d'affinité processeur.
FCPUCount:=0;
FillChar(FCPUMask,SizeOf(FCPUMask),0);
FillChar(FCPUMap,SizeOf(FCPUMap),0);
// Calcul direct du nombre de CPU.
GetCPUCount;
end;
Function TCPU.GetCPUCount : Cardinal ;
Var
I, ProcessMask, SystemMask : Cardinal ;
Begin
// Inutile de tout déclencher si on a déjà le nombre de CPU...
If (FCPUCount=0) Then
Begin
// On va récupérer le nombre de CPU.
FCPUCount:=0 ;
// On compte les bits d'affinité.
Win32Check(GetProcessAffinityMask(GetCurrentProcess,ProcessMask,SystemMask));
// Bon, on a le masque : on va calculer sa taille.
For I:=0 To 31 Do
Begin
// Explosage du masque binaire vers un tableau de booléens.
FCPUMask[I]:=(ProcessMask And (1 Shl I))<>0 ;
// On compte les CPU utilisables, et on crée la map d'assignation.
// Le contenu de CPUMap, à l'indice donné, est donc le masque d'affinité à utiliser.
If FCPUMask[I] Then
Begin
FCPUMap[FCPUCount]:=(1 Shl I) ;
Inc(FCPUCount);
End;
End;
End;
// Le nombre de CPU est correct quel que soit le cas, on renvoie donc le résultat.
Result:=FCPUCount ;
End;
Procedure TCPU.SwitchTo ( Const CPUIndex : Cardinal ) ;
Begin
If (CPUIndex<FCPUCount) Then
If (SetThreadAffinityMask(GetCurrentThread,FCPUMap[CPUIndex])=0) Then
RaiseLastOSError ;
End ; |
Partager