Page 1 sur 1

_WinAPI_SetProcessAffinityMask et Int64

Posté : dim. 15 janv. 2017 17:08
par kamesan
Bonjour, (et Bonne Année à tous!)

Je cherche a faire un outil qui permet de gerer l'affinité des CPU sur un process en cours.
Certaines applications sur ma machine utilise 100% du CPU.
J'aimerai reduire automatiquement l'affinité des CPUS du process concerné afin de pouvoir liberer un peu de ressources pour bosser sur cette machine.

J'ai donc ce script:
#include <WinAPI.au3>
#include <Constants.au3>


$begin = TimerInit()

While 1
      If ProcessExists("notepad.exe") Then
         $process= ProcessList("notepad.exe")

         $sPID = $process[1][1]
         
         $hProc = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, False, $sPID)
         $aRet = _WinAPI_GetProcessAffinityMask($hProc)
         _WinAPI_SetProcessAffinityMask($hProc,0xFFFFFFFF)
         _WinAPI_CloseHandle($hProc)   
EndIf

        Sleep(3000)
WEnd
Ici, l'application est Notepad pour exemple.
Cette ligne regle le nombre de Threads du CPU à 32.
Or ma machine à 56 Threads
J'aimerais donc cocher 54 Threads pour l'utilitaire Notepad.
La ligne devrait etre alors:
_WinAPI_SetProcessAffinityMask($hProc,0x00FFFFFFFFFFFFFC)
Mais malheuresement, j'ai une erreur. Cela n'a pas l'air de marcher au dela de 32 Threads.

Je ne suis pas un utilisateur d'Autoit averti, mais je suppose que _WinAPI_SetProcessAffinityMas n'accepte pas d'envoyer comme parametre un int64.

Est-ce une limitation définitive qui nécessite d’écrire un ticket de request ou connaissez-vous un moyen de contourner ce problème.

En vous remerciant,

Kamesan

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : dim. 15 janv. 2017 18:48
par orax
Bienvenue sur le forum. ^^
Quelle est l'erreur ? Ce code permet d'afficher l'erreur dans la console. S'il n'y a pas d'erreur, il n'y a rien qui s'affiche.
#include <WinAPI.au3>
#include <Constants.au3>

$sPID = Run("notepad.exe")
$hProc = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, False, $sPID)
$iRet = _WinAPI_SetProcessAffinityMask($hProc, 0x00FFFFFFFFFFFFFC)
If Not $iRet Then ConsoleWrite(StringFormat("_WinAPI_GetLastError() = %X\r\n_WinAPI_GetLastErrorMessage() = %s", _WinAPI_GetLastError(), _WinAPI_GetLastErrorMessage()))
_WinAPI_CloseHandle($hProc)
ProcessClose($sPID)

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : dim. 15 janv. 2017 18:56
par kamesan
Merci,
L'erreur est: Unable to parse line.

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : mer. 18 janv. 2017 21:41
par kamesan
Bump :)
Suis toujours bloqué.

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : lun. 23 oct. 2017 02:45
par kamesan
Bonjour,
Je suis toujours bloqué.
Y a t'il une bonne âme?
Je commence a avoir de sérieuses crampes.
:bisou:

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : lun. 23 oct. 2017 04:02
par kamesan
Bon peut-etre devrais-je tourner ma question autrement.
Comment desactiver 2 threads a un process, quelque soit le nombre de threads total?

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : lun. 23 oct. 2017 14:11
par jchd
Certaines applications sur ma machine utilise 100% du CPU.
J'ai tendance à penser que c'est d'abord ce problème-là qu'il faut régler avec l'éditeur du logiciel concerné. Il n'est pas normal qu'un process correctement ficelé monopolise 100% d'un CPU.

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : mar. 24 oct. 2017 14:33
par kamesan
Merci pour ton interet jchd.
Je fais du rendu d'animation 3D, le process utilise à ce moment là 100% des ressources CPU. C'est comme ca. C'est normal. Ca nous rend même triste quand c'est pas le cas.

Mais si ce process de clacul est lancé sur une station sur laquelle quelqu'un bosse, tout se met à ramer inévitablement pour lui.
J'aimerai que 2 thresads soit automatiquement désactivés sur le process consommateur de CPU.

Ca marche sur toutes mes anciennes stations (qui ont 16 threads ou 32 threads) mais cela ne marche pas au delà de 32 threads.
le script autoit ne comprends pas la valeur.

Re: _WinAPI_SetProcessAffinityMask et Int64  

Posté : mar. 24 oct. 2017 14:56
par orax
kamesan a écrit : lun. 23 oct. 2017 04:02 Bon peut-etre devrais-je tourner ma question autrement.
Comment desactiver 2 threads a un process, quelque soit le nombre de threads total?
Pour répondre à cette question, je ferais comme cela...

Code : Tout sélectionner

#include <WinAPI.au3>
#include <Constants.au3>

$sPID = Run("notepad.exe")
$hProc = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, False, $sPID)
$aMask = _WinAPI_GetProcessAffinityMask($hProc)
$iMask = BitShift($aMask[2], 2)
ConsoleWrite(Hex($aMask[2]) & @CRLF)
ConsoleWrite(Hex($iMask) & @CRLF)
$iRet = _WinAPI_SetProcessAffinityMask($hProc, $iMask)
If Not $iRet Then ConsoleWrite(StringFormat("_WinAPI_GetLastError() = %X\r\n_WinAPI_GetLastErrorMessage() = %s\r\n", _WinAPI_GetLastError(), _WinAPI_GetLastErrorMessage()))
_WinAPI_CloseHandle($hProc)
;~ ProcessClose($sPID)
... mais je pense que ça ne changera rien au problème. À mon avis, il y aura toujours cette erreur.

Et peut-être que tu pourrais mettre une priorité très faible au logiciel de rendu avec ProcessSetPriority().

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : mar. 24 oct. 2017 16:24
par kamesan
Merci orax, je regarde ca.
Concernant ProcessSetPriority() c'est ma solution de replie, mais c'est moins précis et je ne sais pas exactement ce qui ce passe en priorité basse...
Ca se met en pause? des micros pause? moins d'affinité CPU? Ca calcule tout les X cycle?
Bref je préfererais qu'il continue a calculer mais avec 2 threads liberés pour d'autres taches....

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : mar. 24 oct. 2017 16:30
par kamesan
orax a écrit : mar. 24 oct. 2017 14:56
Pour répondre à cette question, je ferais comme cela...

Code : Tout sélectionner

#include <WinAPI.au3>
#include <Constants.au3>

$sPID = Run("notepad.exe")
$hProc = _WinAPI_OpenProcess($PROCESS_ALL_ACCESS, False, $sPID)
$aMask = _WinAPI_GetProcessAffinityMask($hProc)
$iMask = BitShift($aMask[2], 2)
ConsoleWrite(Hex($aMask[2]) & @CRLF)
ConsoleWrite(Hex($iMask) & @CRLF)
$iRet = _WinAPI_SetProcessAffinityMask($hProc, $iMask)
If Not $iRet Then ConsoleWrite(StringFormat("_WinAPI_GetLastError() = %X\r\n_WinAPI_GetLastErrorMessage() = %s\r\n", _WinAPI_GetLastError(), _WinAPI_GetLastErrorMessage()))
_WinAPI_CloseHandle($hProc)
;~ ProcessClose($sPID)
... mais je pense que ça ne changera rien au problème. À mon avis, il y aura toujours cette erreur.

Et peut-être que tu pourrais mettre une priorité très faible au logiciel de rendu avec ProcessSetPriority().
Le résultat est que 32 threads sont désactivés. J'aimerais en désactiver 54.

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : mar. 24 oct. 2017 17:05
par kamesan
C'est avec regrets que je constate ma stupidité.
Ca marche très bien.
Encore faut-il lancer autoit en x64!
Aaaah.

Re: _WinAPI_SetProcessAffinityMask et Int64

Posté : mar. 24 oct. 2017 17:26
par orax
Ah ! Je n'avais pas pensé à ça. Voilà qui explique cette limitation. :mrgreen:
Lors de l'installation d'AutoIt, on peut choisir si l'exécution des scripts doit se faire en 32 ou 64 bits. Je crois que c'est "32 bits" qui est sélectionné par défaut.