_WinAPI_SetProcessAffinityMask et Int64

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
kamesan
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 15 janv. 2017 16:33
Status : Hors ligne

_WinAPI_SetProcessAffinityMask et Int64

#1

Message 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
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#2

Message 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)
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
kamesan
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 15 janv. 2017 16:33
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#3

Message par kamesan »

Merci,
L'erreur est: Unable to parse line.
kamesan
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 15 janv. 2017 16:33
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#4

Message par kamesan »

Bump :)
Suis toujours bloqué.
kamesan
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 15 janv. 2017 16:33
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#5

Message par kamesan »

Bonjour,
Je suis toujours bloqué.
Y a t'il une bonne âme?
Je commence a avoir de sérieuses crampes.
:bisou:
kamesan
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 15 janv. 2017 16:33
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#6

Message 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?
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#7

Message 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.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
kamesan
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 15 janv. 2017 16:33
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#8

Message 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.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64  

#9

Message 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().
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
kamesan
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 15 janv. 2017 16:33
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#10

Message 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....
kamesan
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 15 janv. 2017 16:33
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#11

Message 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.
kamesan
Niveau 1
Niveau 1
Messages : 9
Enregistré le : dim. 15 janv. 2017 16:33
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#12

Message par kamesan »

C'est avec regrets que je constate ma stupidité.
Ca marche très bien.
Encore faut-il lancer autoit en x64!
Aaaah.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: _WinAPI_SetProcessAffinityMask et Int64

#13

Message 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.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Répondre