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

Windows Forms Discussion :

Comment tuer sèchement mon application ?


Sujet :

Windows Forms

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut Comment tuer sèchement mon application ?
    Bonjour

    Exit() n'arrête pas mon application sans avoir d'abord laissé tous les messages en cours s'exécuter.

    Est-ce que vous connaissez un moyen d'arrêter mon application directement, sans laisser ces messages s'exécuter ? Un genre de Application.Halt() ...

    Papy !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Application.ExitThread

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Application.ExitThread
    ça marche pas ....

    En fait, mon formulaire principal utilise un assembly qui propose une classe avec un évènement ConnectionLost. L'objet basé sur cette classe est bien créé dans le formulaire principal. Si une procédure de mon objet ne peut se connecter à ma base de données, il déclenche l'évènement, lié à une procédure dans mon formulaire principal. Le code passe bien dans cette procédure mais ensuite, le traitement continue dans l'objet, Le formulaire et l'assembly sont-ils considérés comme 2 threads séparés ?

    Code de la classe dans l'assembly:

    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
     
    public ISession GetSession()
    {
    	ISession session = null;
    	Boolean dontQuit = true;
     
    	while (dontQuit && (session == null))
    	{
    		try
    		{
    			this.CheckSession();
    			session = this.SessionFactory.OpenSession();
    		}
    		catch (ClassExceptions.DatabaseConnectionLostException)
    		{
    			session = null;					
    		}
     
    		if (session == null)
    		{
    			dontQuit = !Utilities.Dialogs.Confirm(Locale._("Database unavailable!"), Locale._("Quit application?"));
    			if (dontQuit)
    				this._SessionFactory = null;
    			else
    				this.OnConnectionLost();
    		}
    	}
    	return session;
    }
    Code de mon formulaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void DatabaseConnectionLost(object sender, EventArgs e)
    {			
    	LockApplication.QuitWithoutMessage = true;
    	Application.ExitThread();
    }
    Je passe bien dans ExitThread à la suite du this.OnConnectionLost(); mais ensuite le programme continue ... dans "return session;"

    Hors, je voudrais que ça s'arrête avant !

    Papy

  4. #4
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    je viens de trouver ce thread ici : http://www.developpez.net/forums/d71...-lapplication/

    J'essaye ...


    .... ça marche .... impec !

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Le formulaire et l'assembly sont-ils considérés comme 2 threads séparés ?
    Pas intrinsèquement, mais il est possible que l'autre assembly crée un autre thread. Si c'est toi qui a créé cet assembly, c'est facile à vérifier

    Si l'évènement ConnectionLost est déclenché sur un autre thread, tu peux utiliser Invoke pour effectuer une action sur le thread principal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void DatabaseConnectionLost(object sender, EventArgs e)
    {			
    	LockApplication.QuitWithoutMessage = true;
    	this.Invoke(new Action(Application.ExitThread));
    }
    (*) Le delegate Action n'existe qu'à partir de .NET 3.5, si tu es dans une version antérieure tu peux le déclarer comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public delegate void Action();
    Citation Envoyé par Papy214 Voir le message
    .... ça marche .... impec !
    N'oublie pas le bouton alors

    Par contre, c'est vraiment crado comme technique... A n'utiliser que si ton appli n'a pas besoin de faire le moindre "nettoyage" avant de quitter.

    Et ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		static void Kill() 
    		{
    			System.Diagnostics.Process proc = System.Diagnostics.Process.GetProcessById(System.Diagnostics.Process.GetCurrentProcess().Id);
    			proc.Kill();
    		}
    Peut être simplifié en ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		static void Kill() 
    		{
    			System.Diagnostics.Process.GetCurrentProcess().Kill();
    		}

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 387
    Points : 2 999
    Points
    2 999
    Par défaut
    this.Invoke(new Action(Application.ExitThread));
    Ben ça marche pas mieux avec ce code. J'ai aussi essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.BeginInvoke(new MethodInvoker(delegate() {
    Application.ExitThread(); }));
    ... qui, à mon avis est équivalent, mais rien de mieux. Le code continue son exécution.

    Alors, pour le coté "crado", je suis d'accord mais je ne vois pas d'autre solution pour le moment. Pour la procédure coté Assembly, c'est bien bien moi qui l'ai écrite, mais aucun Thread la-dedans. C'est pour ça que je me demandais si le fait d'être dans un assembly plutôt que dans du code directement dans le projet pouvait créer un second Thread que je n'aurais pas vu.

    Je me contenterai de ce Kill pour le moment, tout appelant une procédure de nettoyage extraite de mon FormClosing.

    Merci tout de même pour le coup de main

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    C'est vraiment pas "Clean".

    Si vous voulez killer une application, utilisez un programme externe.

    Et encore mieux, un débuggeur en ligne, vous aurez au moins le dump de l'application au moment fatidique.

    Cela ne vous cachera pas le problème et vous donnera toutes les informations pour corriger le vrai problème de votre application instable.

    Comment pouvez-vous fournir une application qui se bloque et y ajouter un mécanisme qui cachera les informations nécessaire à sa correction ?

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

Discussions similaires

  1. comment savoir si mon application est ouverte sur un poste distant
    Par melancolie dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 08/02/2011, 10h15
  2. [JNI] Comment packager proprement mon application?
    Par sinsin dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 25/02/2010, 18h51
  3. Réponses: 20
    Dernier message: 18/05/2008, 16h33
  4. Réponses: 5
    Dernier message: 07/05/2007, 10h44
  5. Réponses: 6
    Dernier message: 18/08/2006, 10h51

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