Comment suspendre un processus sous Windows en passant par ses threads ?

ijneb11 Messages postés 3 Date d'inscription samedi 12 mars 2005 Statut Membre Dernière intervention 16 avril 2008 - 3 avril 2008 à 17:34
ijneb11 Messages postés 3 Date d'inscription samedi 12 mars 2005 Statut Membre Dernière intervention 16 avril 2008 - 16 avril 2008 à 22:12
Bonjour,

Je développe une application 3D en python qui fonctionne sous Linux ET sous Windows. Tout marche (à peu près) bien, excepté un point particulier sur les processus que je n'arrive pas à résoudre.

En fait, mon application a 2 processus (Process du module processing) dont un qui gère toute la partie GTK. Et comme GTK est relativement gourmant même quand il ne fait rien, je suspends le processus concerné quand je n'en ai pas besoin (réduire sa priorité n'est pas suffisant).

Sous Linux, aucun problème, mais sous Windows ... Après quelques recherches, j'ai découvert les modules win32api, win32process (et les autres win32). Je vois comment Démarrer/Arrêter processus et threads, suspendre/reprendre les threads. Mais je n'ai rien trouvé pour suspendre/reprendre un processus ! Mais, par exemple, ProcessExplorer le fait.

Donc, je continue mes recherches et la seule solution envisageable est de trouver tous les threads du processus (tout processus ayant au moins 1 thread) et de les suspendre.

D'où ma question : comment récupérer la liste des threads d'un processus ?

Merci d'avance pour votre aide
Benjamin

2 réponses

beltegeuse Messages postés 44 Date d'inscription mardi 3 mai 2005 Statut Membre Dernière intervention 31 janvier 2009 32
16 avril 2008 à 21:14
je sais pas si ca va t'aider mais j'ai trouver ça :
You could use WMI.

>>> from win32com.client import GetObject
>>> WMI = GetObject('winmgmts:')

Here is how to get the process list:

>>> processes = WMI.InstancesOf('Win32_Process')
>>> len(processes)
41
>>> [process.Properties_('Name').Value for process in processes] # get
the process names
[u'System Idle Process', u'System', u'SMSS.EXE', u'CSRSS.EXE',
u'WINLOGON.EXE', u'SERVICES.EXE', u'LSASS.EXE', u'SVCHOST.EXE',
u'SVCHOST.EXE', u'SVCHOST.EXE', u'SVCHOST.EXE', u'SPOOLSV.EXE',
u'ati2evxx.exe', u'BAsfIpM.exe', u'defwatch.exe', u'inetinfo.exe',
u'mdm.exe', u'rtvscan.exe', u'SCARDSVR.EXE', u'WLTRYSVC.EXE',
u'BCMWLTRY.EXE', u'EXPLORER.EXE', u'Apoint.exe', u'carpserv.exe',
u'atiptaxx.exe', u'quickset.exe', u'DSentry.exe', u'Directcd.exe',
u'vptray.exe', u'ApntEx.exe', u'FaxCtrl.exe', u'digstream.exe',
u'CTFMON.EXE', u'wuauclt.exe', u'IEXPLORE.EXE', u'Pythonwin.exe',
u'MMC.EXE', u'OUTLOOK.EXE', u'LineMgr.exe', u'SAPISVR.EXE',
u'WMIPRVSE.EXE']

Here is how to get a single process and get its PID.

>>> p = WMI.ExecQuery('select * from Win32_Process where
Name="Pythonwin.exe"')
>>> [prop.Name for prop in p[0].Properties_] # let's look at all the
process property names
[u'Caption', u'CommandLine', u'CreationClassName', u'CreationDate',
u'CSCreationClassName', u'CSName', u'Description', u'ExecutablePath',
u'ExecutionState', u'Handle', u'HandleCount', u'InstallDate',
u'KernelModeTime', u'MaximumWorkingSetSize', u'MinimumWorkingSetSize',
u'Name', u'OSCreationClassName', u'OSName', u'OtherOperationCount',
u'OtherTransferCount', u'PageFaults', u'PageFileUsage',
u'ParentProcessId', u'PeakPageFileUsage', u'PeakVirtualSize',
u'PeakWorkingSetSize', u'Priority', u'PrivatePageCount', u'ProcessId',
u'QuotaNonPagedPoolUsage', u'QuotaPagedPoolUsage',
u'QuotaPeakNonPagedPoolUsage', u'QuotaPeakPagedPoolUsage',
u'ReadOperationCount', u'ReadTransferCount', u'SessionId', u'Status',
u'TerminationDate', u'ThreadCount', u'UserModeTime', u'VirtualSize',
u'WindowsVersion', u'WorkingSetSize', u'WriteOperationCount',
u'WriteTransferCount']
>>> p[0].Properties_('ProcessId').Value # get our ProcessId
928

Apres n'étant pas expert en la matière ...
0
ijneb11 Messages postés 3 Date d'inscription samedi 12 mars 2005 Statut Membre Dernière intervention 16 avril 2008
16 avril 2008 à 22:12
Merci pour l'info, ça peut m'être bien utile car je ne m'était pas beaucoup penché sur WMI pour mon problème.
Cet exemple ne montre pas comment accéder aux threads à priori mais peut-être qu'en fouillant à partir de ça je trouverai quelque chose.
0