Layer 1

mardi 26 février 2013

Limiter un process dans le temps

Introduction:
Il peut être utile de limiter une tache ou l'utilisation d'un exécutable dans le temps: limiter le temps d'utilisation d'un jeu pour un enfant (ou un adulte ;-), limiter l'utilisation d'un programme suivant un abonnement ou un crédit de temps...
Après des tests d’accès aux ressources windows via la librairie WMI, puis l'utilisation de multiples de threads, j'ai finalement utilisé des utilitaires de base de windows comme tasklist et taskkill pour accéder aux processus windows: simple et efficace...

Solution:
LimitTask.py se lance comme une commande avec 3 paramètres:  le premier donne le chemin complet de l'exécutable à surveiller, le second donne le temps autorisé d'utilisation de cet exécutable et enfin le troisième paramètre permet la remise à zéro  régulière de ce décompte de temps d'utilisation (abonnement).

L'algorithme est décrit ci-dessous:


Remarques:
-L'utilisation d'une sauvegarde régulière des paramètres de temps, via le fichier LTsave.txt, est indispensable si, par exemple, on redémarre son PC. La relance de LimitTask permet de ne pas perdre la référence du temps d'utilisation/jeu déjà entamés.
-L'utilisation de boite de dialog éphémère (MessageBoxTimeout dans la class LimitTask) est une façon simple de signaler une action (ici le 'kill' de l'exécutable) sans bloquer l’application principale
-Pas d'utilisation de librairies complexes comme WX ou QT, mais uniquement les ressources de bases IHM/GUI Windows via l'excellent wrapper Python for Windows extensions (PyWin32). On aurait pu directement utiliser la librairie windll.user32 via ctypes (moins pythonic)

Vous pouvez retrouvez le code via GitHub.

Dans la suite du billet, le code LimitTask.py et quelques informations pour créer une application windows avec le module py2exe.