using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;
namespace testClasseProcess
{
/*
Cette classe permet de contrôler l'utilisation d'une application en passant le nom
de son processus en paramètre
Elle possède des événements liés au démarrage de l'application (LancementApplication)
et à son arrêt (ArretApplication)
Elle nous informe de la durée d'utilisation de l'application
*/
public class CompteurProcessus
{
private Thread threadProcessus; // thread qui va contenir la procédure de contrôle
private bool stop = false; // booleen qui permet ou non l'accès à la boucle de contrôle
private bool heureDebutBloquee = false; // bloquage de l'heure de lancement de l'application dans la boucle
private bool heureFinBloquee = true; // bloquage de l'heure d'arret de l'application dans la boucle
private DateTime heureDebut; // récupération de l'heure de lancement de l'appliation
private TimeSpan totalTemps; // tps total -> diff. entre heure de début et fin
private string nomApplication; // nom de l'application (processus) à surveiller
private int NombreProcessus; // nombre de processus actifs sur la machine
private decimal tpsUtilisation; // durée d'utilisation de l'application
// evennements de contrôle
public event EventHandler LancementApplication;
public event EventHandler ArretApplication;
public CompteurProcessus()
{
}
public decimal DureeLancement
{
get {return tpsUtilisation;}
}
public int NombreProcessusActifs
{
get {return NombreProcessus;}
}
public void Start(string nomProcessus)
{
nomApplication = nomProcessus;
threadProcessus = new Thread(new ThreadStart(ecouteProcessus));
threadProcessus.Start();
}
public void Stop()
{
threadProcessus.Abort();
threadProcessus = null;
}
private void ecouteProcessus()
{
while (!stop)
{
// récupération des processus actifs sur la machine dans tabProcess
Process[] tabProcess = Process.GetProcesses();
NombreProcessus = tabProcess.Length;
// initialisation du test d'activité du programme a controler (NomApplication)
bool actif = false;
// test d'activité
foreach (Process unProcessus in tabProcess)
{
// si il figure dans la liste -> il est actif
if (unProcessus.ProcessName.ToLower() == nomApplication.ToLower())
actif = true;
}
// si le programme tourne
if (actif)
{
// si il vient d'être lancé -> heure de début non bloquée
// (on entre qu'une seule fois dans cette boucle)
if (!heureDebutBloquee)
{
// on récupère l'heure de début
heureDebut = DateTime.Now;
// on bloque l'acces a cette boucle
heureDebutBloquee = true;
// on débloque l'acces a la boucle d'heure de fin
heureFinBloquee = false;
// evennement déclenché lorsque l'application démarre
LancementApplication(this,EventArgs.Empty);
}
}
// si le programme ne tourne pas (ou plus)
else
{
// si il était lancé et vient d'être arrêté
// (on entre qu'une seule fois dans cette boucle)
if (!heureFinBloquee)
{
// on calcule la différence entre l'heure du lancement et l'heure actuelle
totalTemps = DateTime.Now.Subtract(heureDebut);
// on bloque l'acces à cette boucle
heureFinBloquee = true;
// on débloque l'acces à la boucle d'heure du lancement
heureDebutBloquee = false;
// le temps de l'utilisation du programme (en secondes) est converti en decimal
tpsUtilisation = decimal.Round(Decimal.Parse(totalTemps.TotalSeconds.ToString()),0);
// evennement déclenché lorsque l'application s'arrête
ArretApplication(this,EventArgs.Empty);
}
}
}
}
}
}