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

C# Discussion :

[processus] Fermer une application suite à un test dans le constructeur


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut [processus] Fermer une application suite à un test dans le constructeur
    Bonjour,

    Je travaille actuellement en C# (2.0) avec VS2008. J'ai un petit souci que je n'arrive pas à élucider, à savoir : lorsque j'arrive à fermer une application suite à un test lors du démarrage, j'ai toujours le processus rattaché qui reste monté en mémoire (présent dans le gestionnaire des taches)...

    J'ai essayé les techniques suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public GererEspaceUtilisateurForm(String distinguishedName)
            {
                InitializeComponent();
                //Traitement
                if (!TEST)
                       this.FermerApplication();
            }
     
    private void FermerApplication()
            {
                 this.Close();
            }
    Ce code là me fait péter l'application ce qui est normal!

    J'ai ensuite essayé avec un delegate
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public delegate void ExitApplication();
     
    public GererEspaceUtilisateurForm(String distinguishedName)
            {
                InitializeComponent();
                //Traitement
                if (!TEST)
                    this.Invoke(new ExitApplication(this.FermerApplication));
            }
     
    private void FermerApplication()
            {
                 this.Close();
            }
    Pareil une erreur. on ne peut pas faire d'Invoke dans le constructeur.


    Puis j'ai essayé en lançant un thread parallèle afin de laisser le temps à ma form de se charger correctement

    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
    public delegate void ExitApplication();
    public GererEspaceUtilisateurForm(String distinguishedName)
            {
                InitializeComponent();
                //Traitement
                this.ouvertureUC.RunWorkerAsync(distinguishedName);
            }
     
    private void FermerApplication()
            {
                 this.Close();
            }
     
    private void ouvertureUC_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
            {
                while (!this.Created)
                {
                    System.Threading.Thread.Sleep(200);
                }
     
                if (!TEST)
                    this.Invoke(new ExitApplication(this.FermerApplication));
            }
    Et là cela marche mais le processus reste en vie malgré le fait que la form se ferme bien...

    Quelqu'un aurait-il l'explication à mon problème?

    Merci!

    Rastamath69

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Salut,

    Le processus ne s'appellera pas TonAppli.vhost.exe par hasard ?
    C'est normal c'est utilisé par VS pour le debug.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    oui effectivement celui là est celui de VS! Et non ce n'est pas celui là!!

    Rastamath69

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    Est ce que ce n'est pas ta fonction static void Main() qui n'est pas quitté correctement?

    Tu peux fermer tous les formulaires mais si tu ne sort pas du main le processus sera toujours vivant

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    ma classe static Main ressemble à ceci:

    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
    static class Program
        {
            /// <summary>
            /// Point d'entrée principal de l'application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                String[] args = Environment.GetCommandLineArgs();
     
                if (args.Length > 1)
                {
                    Application.Run(new GererEspaceUtilisateurForm(args[1]));
                }
                else
                {
                    Application.Run(new GererEspaceUtilisateurForm());
                }
            }
        }
    Donc elle n'a vraiment rien de spécial si ce n'est le fait que lorsqu'elle prend un paramètre en entrée elle n'utilise pas le même constructeur.

    Pour information, tant que je n'essaie pas de fermer mon application automatiquement, suite à un test dans le constructeur, mais que je la ferme manuellement par le bouton "quitter" (qui appelle la même méthode "FermerApplication") tout se passe bien!

    Rastamath69

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    l'erreur semble provenir de la fermeture dans le constructeur. D'un point de vue conception, trouves tu logique de fermer quelque chose qui n'a pas d'être initialisé ? du coup, le thread se retrouve dans un état deadlock car la forme est disposée.

    Essaye de déporter la fermeture de la fenêtre dans une méthode.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    Essaie ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            public GererEspaceUtilisateurForm(String distinguishedName)
            {
                InitializeComponent();
                //Traitement
                if (!TEST)
                       throw new ExceptionToClose();
            }
     
     
    public class ExceptionToClose
    {
    }
    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
    static class Program
        {
            /// <summary>
            /// Point d'entrée principal de l'application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                String[] args = Environment.GetCommandLineArgs();
     
                try
                {
                        if (args.Length > 1)
                        {
                              Application.Run(new GererEspaceUtilisateurForm(args[1]));
                        }
                        else
                        {
                               Application.Run(new GererEspaceUtilisateurForm());
                        }
                }
                catch(ExceptionToClose eException)
                {
                }
            }
        }

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    cybermax =>
    - je suis d'accord sur ta logique des threads, mais j'ai eu beau faire en sorte que mon thread principal ne se termine pas avant le second que je créé (avec l'aide d'un "sleep" tout bête) et bien cela ne change rien. En gros je n'ai pas de thread zombie, je m'en assure.
    - "Essaye de déporter la fermeture de la fenêtre dans une méthode. " : tu trouveras ce test dans le premier de mes 3 exemples!

    Troopers => Je ne dis pas que ce n'est pas une solution, mais je la qualifie d'extrême!! Gérer mon souci en envoyant une Exception, personnellement je trouve cela un peu barbare... Es-tu sûr que ce serait la solution dans les règles de l'art à mon souci?
    Pour moi la gestion d'erreur doit rester de la gestion d'erreur, or là je n'ai pas une erreur, seulement un cas où j'aimerais que mon application se ferme automatiquement sans anicroche!

    Rastamath69

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    Points : 1 120
    Points
    1 120
    Par défaut
    Citation Envoyé par rastamath69 Voir le message
    cybermax =>
    - "Essaye de déporter la fermeture de la fenêtre dans une méthode. " : tu trouveras ce test dans le premier de mes 3 exemples!
    9
    je voulais dire "en dehors du constructeur". Après le InitializeComponent() une forme n'est pas encore affichée. Ferme une form dans le constructeur c'est donc impossible.

    Dans la série des solutions brutale, je vous présente Application.Exit

  10. #10
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Bonjour,

    Du point de vue de la conception je serais plutôt d'accord avec Troopers, pour la simple et bonne raison que le but d'une classe (que ce soit un UserControl ou une classe "standard") est avant tout de pouvoir être réutilisé par d'autres développeurs pour d'autres projets en développant une fonctionnalité.

    Là tu obliges tous les gens qui voudraient s'en servir à quitter dans ce cas là, alors que d'autre pourraient préférer gérer l'Exception, enregistrer un log, visionner une vidéo peu importe. Même si ce n'est que pour ton usage perso, le principe reste le même.

    En espérant avoir été utile ! (et compris déjà )

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Ah ok, je n'avais pas compris!
    Mais alors comment fais-tu pour faire comprendre à ta form qu'elle doit se fermer, suite à un test dans le constructeur? A part en faisant un méli-mélo d'event dans tous les sens et donc au minimum un autre thread? (parce que externaliser cela, j'y ai pensé mais à part une usine à gaz, je ne trouve pas de solution élégante à mettre en oeuvre!!! ;-) )

    Pour le ou encore le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ExitThread();
    j'ai également essayé pour info!!

    Rastamath69

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Sehnsucht => Oui tu as compris! Le but de la classe est effectivement de se fermer dans un certain cas précis! Quelque que soit le code qui l'appelle! En gros le test est une recherche et il ne faut donc pas que la fenêtre de résultat s'affiche lorsqu'on instancie cette form si je n'ai pas de résultat! Et l'idée de gérer le cas "pas de résultat", comme une exception est, pour moi en tout cas, gênant...!

    Rastamath69

  13. #13
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Citation Envoyé par rastamath69 Voir le message
    Sehnsucht => Oui tu as compris! Le but de la classe est effectivement de se fermer dans un certain cas précis! Quelque que soit le code qui l'appelle! En gros le test est une recherche et il ne faut donc pas que la fenêtre de résultat s'affiche lorsqu'on instancie cette form si je n'ai pas de résultat! Et l'idée de gérer le cas "pas de résultat", comme une exception est, pour moi en tout cas, gênant...!

    Rastamath69
    Ce que j'énonce comme mise en défaut d'un constructeur c'est par exemple un constructeur avec un paramètre "taille de tableau" négatif, ça c'est une impossibilité donc traité comme une erreur.

    Dans ton cas ce n'est pas une erreur mais une éventualité que tu ne souhaites pas gérer, pourquoi parce que là je décroche en quoi c'est un souci d'afficher une fenêtre de résultat "vide" dans le cas pas de résultat, c'est tout à fait cohérent.


  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Sehnsucht Voir le message
    Dans ton cas ce n'est pas une erreur mais une éventualité que tu ne souhaites pas gérer, pourquoi parce que là je décroche en quoi c'est un souci d'afficher une fenêtre de résultat "vide" dans le cas pas de résultat, c'est tout à fait cohérent.

    Au contraire, je souhaite justement gérer ce cas là! Il est simplement géré en fonction des contraintes fonctionnelles qu'on me définit!
    Je suis d'accord avec toi qu'une fenêtre de recherche peut être vide (c'est une des manières de faire), mais dans mon cas les contraintes font que j'ai un besoin spécifique : à savoir ne pas afficher les fenêtres de résultat quand elles ne retournent rien! Mais ceci reste du fonctionnelle, et en tant que développeur on doit s'y plier!!

    Tout ça pour dire que le comportement que j'essaie d'obtenir, je souhaiterai l'avoir sans pour autant lancer une exception!
    Après si je suis ici c'est pour voir les différentes manières de faire que vous (d'autres développeurs) pouvez avoir!!
    Je reste ouvert à tout ce qu'on peut me proposer (c'est pour cela que j'ai simplement dit que je ne trouvais pas élégante la solution avec une exception, mais je ne la rejette pas pour autant définitivement)

    Rastamath69

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    Il n'y a pas énormament de solutions pour sortir d'un constructeur sans que l'instance soit créé :
    - soit sortir en exception
    - soit faire le test d'en l'appelant avant d'invoker le constructeur

    Si tu ne veux pas gérer d'exception, le test doit être placé dans l'appelant c'est à dire le main pour toi :
    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
    static class Program
        {
            /// <summary>
            /// Point d'entrée principal de l'application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                String[] args = Environment.GetCommandLineArgs();
     
                if(args.Length > 1 && Test(args))
                {
                       Application.Run(new GererEspaceUtilisateurForm(args[1]));
                 }
                 else
                 {
                       Application.Run(new GererEspaceUtilisateurForm());
                 }
     
            }
        }

  16. #16
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Points : 2 137
    Points
    2 137
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            public GererEspaceUtilisateurForm()
            { InitializeComponent(); }
     
            private void GererEspaceUtilisateurForm_Load(object sender, EventArgs e)
            { if (!TEST) { this.FermerApplication(); } }
     
            private void FermerApplication()
            { this.Close(); }
    ... Non ?

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    Points : 136
    Points
    136
    Par défaut
    Effectivement, j'avais oublié cette possibilité là!! bien vu quoique j'ai un doute sur la possibilité d'appeler le close sur le load

  18. #18
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Points : 2 137
    Points
    2 137
    Par défaut
    On est passé dans le constructeur, le formulaire est créé, personnellement j'ai bon espoir ^^

    A tester tout de même.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Effectivement dans le Load, l'instance existe!

    Malheureusement cela me fait pareil... L'application se ferme bien mais le processus reste listé...

    De plus, chose à laquelle je ne m'attendais pas : j'ai testé avec la méthode de lancer une exception, hé bien devinez quoi?! Pareil!!! L'application se termine, mais le processus reste listé....

    C'est assez incroyable... D'autant plus que si le test, dans le constructeur, réussi, que l'instance se créée et que je clique moi-même sur le bouton de fermeture qui me déclenche le Close() de la Form, ben là le processus se termine bien correctement et n'est plus listé...

    Je dois avouer que je m'emplis d'interrogations??? J'étais persuadé que la méthode consistant à lancer une exception marcherait même si elle ne me plaisait pas...

    Rastamath69

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    J'ai résolu mon problème!!

    En fait dans le cas précis où mon test échouait (et donc le moment où je souhaitais fermer l'application) un flux restait ouvert, et empêchait donc mon processus de se terminer...
    Le "TEST" que je faisais était en fait un appel à une méthode d'une autre DLL, et il se trouve que cette méthode ouvre un flux sur un serveur LINUX... Et si lors d'une erreur le "Close()" du flux n'est pas fait dans le "Finally", et bien cela nous fait un processus qui ne se ferme pas!!


    Donc pour info, que ce soit ma 3ième méthode (celle avec un thread parallèle ou bien la méthode que m'a proposé I_Pnose (celle qui implémente le LOAD) les deux fonctionnent! Je vais d'ailleurs garder celle de I_Pnose, que je trouve, ma foi, assez élégante!

    Merci à vous tous qui m'avez aidé!!

    @++
    Rastamath69

    PS : j'ai pu voir qu'un flux, lié à mon processus récalcitrant, était ouvert, grâce à l'outil "Process Explorer" qui permet de voir les DLL et autres composants raccrochés à un processus qui tourne

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

Discussions similaires

  1. [Batch] Fermer une application dans un fichier Batch
    Par Egan69 dans le forum Scripts/Batch
    Réponses: 10
    Dernier message: 04/01/2018, 16h22
  2. Fermer une application Windows
    Par telecnop dans le forum Langage
    Réponses: 20
    Dernier message: 28/06/2006, 21h15
  3. processus : fermer une fenêtre IE spécifique
    Par s.grenet dans le forum Général Conception Web
    Réponses: 11
    Dernier message: 26/08/2005, 13h41
  4. [VB6]Fermer une application avec VB
    Par Mylou dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 04/04/2003, 21h32
  5. Fermer une application à l'aide de OnIdle
    Par Thierry Rapp dans le forum Composants VCL
    Réponses: 2
    Dernier message: 29/08/2002, 12h44

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