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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    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 confirmé
    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
    Par défaut
    oui effectivement celui là est celui de VS! Et non ce n'est pas celui là!!

    Rastamath69

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    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 confirmé
    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
    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 Expert
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    826
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 826
    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 confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 208
    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)
                {
                }
            }
        }

+ 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