;`USE: Read the cpu count using the function cpu_count()
;`USE: set the cpu using the function set_affinity(input) - input takes the cpu no.
;`example: USE the last cpu core only: set_affinity(cpu_count())
Declare set_affinity(in)
Declare cpu_count()
Debug "CPU count: "+Str(cpu_count())
Debug "CPU use set: "+Str(set_affinity(%000000000000000000000001))
Procedure cpu_count()
*lpProcessAffinityMask=AllocateMemory(32)
*lpSystemAffinityMask= AllocateMemory(32)
hProcess=GetCurrentProcess_()
get= GetProcessAffinityMask_(hProcess,*lpProcessAffinityMask,*lpSystemAffinityMask)
For cpu_count=1 To 32
If Mid(Bin(*lpProcessAffinityMask),cpu_count,1)="0" : Break:EndIf
Next cpu_count
cpu_count= cpu_count-1
FreeMemory(*lpProcessAffinityMask)
FreeMemory(*lpSystemAffinityMask)
ProcedureReturn cpu_count
EndProcedure
Procedure set_affinity(in)
; `FOR INFO GO To: http://msdn2.microsoft.com/en-us/library/ms686223.aspxv
*lpProcessAffinityMask=AllocateMemory(32)
*lpSystemAffinityMask= AllocateMemory(32)
hProcess=GetCurrentProcess_()
get= GetProcessAffinityMask_(hProcess,*lpProcessAffinityMask,*lpSystemAffinityMask)
*lpProcessAffinityMask=in
succes=SetProcessAffinityMask_(hProcess,*lpProcessAffinityMask)
FreeMemory(*lpSystemAffinityMask)
EndProcedure
voila j'ai fait ça sans avoir de multicore, mais vous pouvez verifier s'il vous plait ?
ce code affiche le nombre de coeur trouvé dans votre system
puis il active un coeur ici le 1 pour l'exemple , mais justement testez le 2
si vous avez un multicore ...
je lui fait faire une recherche de nombre particulier, pour occuper le processeur choisi
le but de l'algo c'est de trouver des nombre qui multiplié par eux-meme donne un nombre qui ce termine par le fameux nombre...
ex : 6x6=36
ou bien
9376x9376=97909376
algo corrigé !!
apres je ne sait pas si vous avez un moyen de controler quel CPU fonctionne ?
testez moi ça donc :
;`USE: Read the cpu count using the function cpu_count() ;`USE: set the cpu using the function set_affinity(input) - input takes the cpu no. ;`example: USE the last cpu core only: set_affinity(cpu_count()) Declare set_affinity(in) Declare cpu_count()
l.d=2
Debug "CPU count: " + Str (cpu_count()) ; on choisi un processeur pour travailler !! Debug "CPU use set: " + Str (set_affinity(1)) ; set_affinity(numero du processeur choisi pour travailler )
;****************************** calcul pour occuper le processeur choisi ***************** ; Code par Dobro
Resultat = OpenConsole ()
Procedure NbCores()
If ExamineEnvironmentVariables()
While NextEnvironmentVariable()
If EnvironmentVariableName() = "NUMBER_OF_PROCESSORS"
Valeur = Val(EnvironmentVariableValue())
ProcedureReturn Valeur
EndIf
Wend
EndIf
EndProcedure
Debug NbCores()
Si vous avez du dual core, le gestionnaire des tâches montre les 2 au travail dans l'onglet "Performances", enfin chez moi ça marche.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Je pense que le code de base PowerBasic avait une légère erreur qui s'est poursuivi dans la conversion et sans pouvoir tester sur son pc impossible à voir
donc pour la commande CPU_COUNT je la remplacerai plutot par GETAFFINITY
Dim idThread As Long
Dim idProcess As Long
Dim ProcessAffinity As Long
Dim SystemAffinity As Long
Dim lRet As Long
Dim hProcess As Long
idProcess = Shell("C:\Program Files\Microsoft" & _
" Office\Office\MSACCESS.EXE" & _
" C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb", _
vbMaximizedFocus)
If idProcess Then
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or _
PROCESS_SET_INFORMATION, False, idProcess)
lRet = GetProcessAffinityMask(hProcess, ProcessAffinity, _
SystemAffinity)
ProcessAffinity = 1 ' this sets the process to only run on CPU 0
' for CPU 1 only use 2 and for CPUs 1 & 2 use 3
lRet = SetProcessAffinityMask(hProcess, ProcessAffinity)
CloseHandle (hProcess)
End If
; Définition d'après MSDN (Traduction...) ; Le lpSystemAffinityMask correspond au numéro du ou des processeurs utilisables par le processus ; Le lpProcessAffinityMask correspond au numéro du ou des processeurs dont il est affilié (Le process est un sous-ensmble du system) ; D'après mes tests la plupart des processus ont le même numéro
; Valeur de retour de la commande : ; Si on a un dual core ; 1 = CPU 0 ; 2 = CPU 1 ; 3 = CPU 0+1
ProcedureDLL.l cpu_count() ; Retourne le nombre de processeur
Protected resultat, Lib, SBI.SYSTEM_BASIC_INFORMATION
Lib = OpenLibrary ( #PB_Any , "ntdll.dll" ) If Lib If CallFunction (Lib, "NtQuerySystemInformation" , #SystemBasicInformation , @SBI, SizeOf (SYSTEM_BASIC_INFORMATION), 0) = 0
resultat = SBI\NumberOfProcessors EndIf CloseLibrary (Lib) EndIf ProcedureReturn resultat EndProcedure
OU en plus court
ProcedureDLL.l cpu_count() ; Retourne le nombre de processeur
Protected SI.SYSTEM_INFO GetSystemInfo_ (@SI) ProcedureReturn SI\dwNumberOfProcessors EndProcedure