Instance unique



télécharger le projet exemle (2.53 ko)

Si votre application peut être ouverte à partir de l'explorateur Windows, ou si votre application peut gérer des noms de fichiers en paramètres, il peut être interressant d'ouvrir tous les fichiers dans une instance unique, plutôt que d'ouvrir plusieurs fois votre application, particulièrement si le chargement de votre application est long (souvenez-vous de Delphi 3, qui ouvrait une nouvelle instance à chaque ouverture de fichier depuis l'explorateur...)

Pour éviter ceci, on peut forcer l'application à ne s'ouvrir qu'une seule fois, en testant à sa création si une instance est déjà en cours. Pour ce faire, nous allons utiliser ici la méthode probablement la plus élégante, qui met en place les Mutex. Un mutex est une sorte de variable globale automatiquement libérée à la fermeture de l'application. Les mutex ont l'avantage de générer une erreur si une instance est déjà en route. Il suffit donc d'intercepter cette erreur pour éviter les instances multiples.

Etudions tout d'abord le code de base d'une application. Pour cela, créez un nouveau projet, et Regardez le source du projet (Menu "Projet\Voir le source" sous D4 et D5, ou "Voir\Source" sous D3). Le projet se présente ainsi:

Application standard

program mutex;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.



Nous allons maintenant créer le mutex. Il faut d'abord ignorer la dernière erreur, grâce à la commande SetLastError(NO_ERROR). Ensuite, nous créons le mutex proprement dit, avec la commande CreateMutex (nil, False, 'Texte'). Si le mutex existait déjà, on obtient une erreur ERROR_ALREADY_EXISTS. Dans ce cas, nous ne créons pas l'application. Sinon, on la créée normalement. Mais, en premier lieu, il nous faut inclure l'unité Windows, car c'est elle qui contient toute la gestion des mutex. Voici le code:

Mutex mis en place

program mutex;

uses
  Windows,
  Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
  SetLastError(NO_ERROR);
  CreateMutex (nil, False, 'Texte');
  if GetLastError = ERROR_ALREADY_EXISTS then Exit;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.



3 requête(s) SQL executée(s) en 0.001 Secs - Temps total de génération de la page : 0.006 Secs