Comment ne lancer qu'une instance de mon programme...

Soyez le premier à donner votre avis sur cette source.

Snippet vu 12 990 fois - Téléchargée 34 fois

Contenu du snippet

Vérifier qu'il n'y a pas déja une instance de mon programmme qui s'éxécute
et s'arrêter si c'est le cas.

utilisation de la classe "Mutex".

Source / Exemple :


using System.Threading;
.......

// code mis dans Main d'une application windows form

static void Main() 
{
     bool OK;
     string moiID="UNE CHAINE QUELCONQUE ET UNIQUE";
     Mutex moi=new Mutex(true,moiID,out OK);
     if(OK)
     {
          Application.Run(new Form1());
          moi.ReleaseMutex();
     }
     else 
     {
          MessageBox.Show("Je tourne déja...");
     }
}

A voir également

Ajouter un commentaire Commentaires
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Tiens ????
8<-------- de Elektordi le 17/12/2004 20:13:05
Et si le programme plante ?
-------->8
8<-------- de sergebre le 18/12/2004 12:22:20
tu utilises un gestionnaire d'erreur, le blabla habituel.
try-catch-finally par exemple, au niveau de la création du mutex et au niveau de Application.Run(....).

c'est pas les exemples qui manque sur le site...
-------->8

Les mutex ne sont pas gérer par Windows directement ??? Si l'appli plante le mutex est détruit par Win donc pas besoin de gestion d'erreur (perso je n'est jamais utilisé la class mutex donc à testé mais les APIs ci dessous fonctionne sur ce principe ;) )

Déclaration pour VB6 :
Crée un Mutex
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As Long, ByVal bInitialOwner As Long, ByVal lpName As String) As Long

Ouvre un mutex si il existe (retourne 0 si il n'existe pas ;))
Private Declare Function OpenMutex Lib "kernel32" Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long

Voila bonne prog

:) amicalement :)
Messages postés
10
Date d'inscription
mercredi 4 février 2004
Statut
Membre
Dernière intervention
4 juin 2010

Principe du process : mauvais.
Pourquoi ne pourrais-je pas avoir plusieurs appli (différentes) ayant le même nom de process ?

Voici une solution qui semble bien :
http://www.csharpfr.com/codes/SEULE-INSTANCE-APPLICATION_36791.aspx
Utilise le principe de la classe mutex ...
Messages postés
46
Date d'inscription
mercredi 19 mai 2004
Statut
Membre
Dernière intervention
26 juillet 2007

exactement, moi je passe par les process,c'est beaucoup plus simple
#region Main
[STAThread]
static void Main()
{
try
{
Process proc = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName (proc.ProcessName);
if (processes.Length != 1)
return;
Application.Run(new From1());
}
catch()
}
{}
Messages postés
186
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
21 janvier 2008

Je voulait dire que ce n'était pas la meuilleure solution car vérifier si un process du même nom tourne déjà est bcps plus fiable !
Messages postés
10
Date d'inscription
vendredi 20 juin 2003
Statut
Membre
Dernière intervention
26 décembre 2003

tu utilises un gestionnaire d'erreur, le blabla habituel.
try-catch-finally par exemple, au niveau de la création du mutex et au niveau de Application.Run(....).

c'est pas les exemples qui manque sur le site...
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.