IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

lancer l'application une seule fois


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut lancer l'application une seule fois
    Slt;je ne c'est pas si le sujet à été traité ou tous simplement j'ai pas bien choisi les mots clé pour la recherche.
    j'ai le raccourci de mon application sur le bureau est si je clique deux fois sur la même icône j'ai deux interface de la même application.
    une idée

  2. #2
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031

  3. #3
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Salut,

    Dans le même esprit, j'utilise ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    program Project1;
    uses
      Windows, Forms, Dialogs, SysUtils,
      Unit1 in 'Unit1.pas' {Form1};
    {$R *.res}
    begin
      SetLastError(NO_ERROR);
      if CreateMutex(Nil,true,pChar('MutexFor' + ExtractFileName(Application.ExeName))) = 0 then Halt;//La création du Mutex a échoué.
      if GetLastError = ERROR_ALREADY_EXISTS then begin//Le Mutex existe déjà.
        ShowMessage('Cette application est déjà lancée !');
        Halt;
      end;
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.

  4. #4
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Bonjour ; merci Cary... une fois testé je donnerai suite.

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Il y a aussi le TJvAppInstance de la JVCL.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ Caribensila, j'utilise ceci dans l'unité du projet :

    Uses

    Windows, Forms, ect...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    {$R *.res}
     
    var
    	H : THandle;
    	Erreur: Integer;
     
    begin
      SetLastError(NO_ERROR);
      H := CreateMutex (nil, False, 'Nom de mon application');
      Erreur := GetLastError;
      if ( Erreur = ERROR_ALREADY_EXISTS ) or ( Erreur = ERROR_ACCESS_DENIED )
      then Exit;
     
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
     
      CloseHandle(H);
    end.
    Fonctionne aussi sur Seven 32 et 64 bits

    @+,

    Cincap

  7. #7
    Inactif
    Homme Profil pro
    Analyste-programmeur Delphi
    Inscrit en
    Décembre 2003
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur Delphi

    Informations forums :
    Inscription : Décembre 2003
    Messages : 490
    Points : 287
    Points
    287
    Par défaut
    Bonjour à tous.

    J'avais déjà demandé de l'aide sur le sujet et, finalement, j'étais arrivé à cette solution ultra-simple qui fonctionne très bien :

    Dans le source du projet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      with Application do
           begin
             if not Assigned(NomDeLaFichePrincipale)
                then
                  begin
                    Initialize;
                    CreateForm(TNomDeLaFichePrincipale, NomDeLaFichePrincipale);
                  end
                else
                  Exit;
              ... création des autres fiches...
           end;

  8. #8
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Effectivement, c'est remarquable de simplicité !

    Mais pour ceux qui aiment les trucs pas simples, y'a aussi ça :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    N'autoriser que 'n' instances de l'application
     
    program Project1;
     
    uses
      SysUtils,Windows,Dialogs,Forms,
      Unit1 in 'Unit1.pas' {Form1};
     
    {$R *.res}
     
     
    const NbreProcess : Integer = 1; //Nbre maxi de processus autorisés.
            SEMAPHORE_ALL_ACCESS  = EVENT_ALL_ACCESS;
     
    var   HdleSem : THandle; //Handle du Sémaphore.
           Count     : Integer;   //Nbre d'accès au Sémaphore dejà utilisés.
     
     
    begin
    HdleSem := OpenSemaphore(SEMAPHORE_ALL_ACCESS,true,'NomSem');//On essaie d'ouvrir le sémaphore.
    if HdleSem=0 then begin //Si pas encore créé, c'est donc la 1ère instance et..
      HdleSem := CreateSemaphore(nil,0,NbreProcess,'NomSem'); //..on le crée.
      if HdleSem = 0 then begin //Si échec de la création..
        ShowMessage('Erreur d''ouverture du sémaphore !') ;
        Halt; //..on quitte.
      end ;
    end;
     
    if not(releaseSemaphore(HdleSem,1,@count)) then begin //Si l'ajout d'un nouvel accès au Sémaphore échoue..
      ShowMessage('Pas plus de ' + IntToStr(NbreProcess) + ' processus !'); //.. c'est que le nombre maxi est atteint et..
      Halt;      //..on quitte..
      end ;
     
      Application.Initialize;   //..sinon la limitation n'est pas atteinte et on continue.
      Application.CreateForm(TForm1, Form1);
      Application.Run;
      {Fonction d'attente qui décrémente le compteur du Sémaphore quand on supprime un des process.}
      WaitForSingleObject(HdleSem,0) ;
    END.

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Petite question au niveau du mutex.
    Si l'application est tué, est ce que le mutex l'est aussi ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Petite question au niveau du mutex.
    Si l'application est tué, est ce que le mutex l'est aussi ?
    Bonne question !

    The system closes the handle automatically when the process terminates. The mutex object is destroyed when its last handle has been closed.

  11. #11
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    ... Petite précision :

    On peut détruire le Mutex sans pour autant détruire tous les processus qui l'utilisent en utilisant autant de fois CloseHandle qu'il y a de processus.

  12. #12
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Euh... tu as fait le test ?

    Le premier processus crée le sémaphore en appelant CreateSemaphore. Il obtient un premier handle sur le sémaphore qui a été crée.
    Les autres processus réclament un accès au sémaphore déjà créé avec OpenSemaphore. Chaque processus obtient alors un handle différent, référencant le même sémaphore.

    Pour que le sémaphore soit détruit, il faut fermer tous les handles qui ont été ouverts sur le sémaphore. Il ne sert à rien de fermer 15 fois le même handle, il faut fermer chaque handle une et une seule fois.
    Si tu fais 15 fois le close du même handle, le premier appel va décrémenter le compteur de référence du sémaphore et invalider le handle. Si tu refais l'appel avec le même handle, tu vas te récupérer une erreur ERROR_INVALID_HANDLE du fait que ton handle est déjà invalide...
    Si tu ne connais pas les autres processus, comment fait tu pour connaitre les handles à fermer ?

  13. #13
    Membre éprouvé Avatar de redoran
    Homme Profil pro
    Développeur-Amateur
    Inscrit en
    Juin 2010
    Messages
    1 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur-Amateur
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2010
    Messages : 1 346
    Points : 1 031
    Points
    1 031
    Par défaut
    Re ; c'est très intéressant comme débat mais là je me retrouve plus...
    je prend cette solution http://delphi.developpez.com/faq/?page=interexecution

  14. #14
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Citation Envoyé par Franck SORIANO Voir le message
    Euh... tu as fait le test ?
    Non, je n'ai pas testé. Je me reférais simplement à l'Aide qui stipule « the mutex object is destroyed when its last handle has been closed ».
    Mais j'avoue que je ne me suis jamais trouvé en situation de devoir détruire manuellement un mutex.

    Pour le sémaphore, je sais qu'il a me même mécanisme de destruction que le mutex: quand on ferme son dernier handle. Donc, si on voulait le détruire manuellement, il faudrait effectivement connaître ses différents handles.

    Ma "petite précision" était nulle et non avenue.

  15. #15
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 427
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ tous,

    La solution que j'avais proposée, libère le mutex !

    @ Redoran, le lien que tu donnes utilise la même méthode que j'avais proposé.

    @+,

    Cincap

  16. #16
    Inactif
    Homme Profil pro
    Analyste-programmeur Delphi
    Inscrit en
    Décembre 2003
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur Delphi

    Informations forums :
    Inscription : Décembre 2003
    Messages : 490
    Points : 287
    Points
    287
    Par défaut
    La solution que je donne n'a pas besoin de mutex

  17. #17
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    @Franck SORIANO

    J'ai un doute maintenant...
    Penses-tu que ma proposition #3 ne libère pas le Mutex à la fermeture du processus qui l'a créé ?

  18. #18
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 700
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 700
    Points : 13 146
    Points
    13 146
    Par défaut
    Citation Envoyé par Caribensila Voir le message
    J'ai un doute maintenant...
    Penses-tu que ma proposition #3 ne libère pas le Mutex à la fermeture du processus qui l'a créé ?
    Il faut nuancer la réponse

    Le handle est fermé automatiquement à la fin du processus. Si le compteur d'utilisation du mutex est à 0, il est libéré. Dans le principe, ce n'est donc pas forcément l'application qui a fait le premier appel à CreateMutex qui le libérera, mais plutôt la dernière à fermer le handle.

    Dans le cas de l'instance unique et puisque les applications sont terminées immédiatement, c'est bien l'application responsable de sa création qui le détruira.

  19. #19
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Merci pour cette confirmation, Andnotor.
    J'ai cru un moment avoir vécu des années dans l'erreur.

  20. #20
    Membre confirmé Avatar de cantador
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2006
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mars 2006
    Messages : 569
    Points : 484
    Points
    484
    Par défaut lancer l'application une seule fois
    Bonjour,

    @od.dev:

    ta proposition ne répond pas à la question posée qui est de ne pas pouvoir
    lancer plusieurs fois une même application..

    les solutions utilisant un mutex (Caribensila, Cincap) fonctionnent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer un service une seule fois
    Par Jose.N70 dans le forum Android
    Réponses: 1
    Dernier message: 03/11/2014, 11h48
  2. [AC-2007] lancer macro qu une seul fois
    Par tprun dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/05/2009, 08h12
  3. Lancer une application une seule fois - numero de process
    Par lefabdepau dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/02/2007, 16h23
  4. Ouvrir une application une seule fois - numero de process
    Par lefabdepau dans le forum VB.NET
    Réponses: 1
    Dernier message: 20/02/2007, 13h12
  5. Réponses: 2
    Dernier message: 04/07/2006, 02h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo