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++/CLI Discussion :

Fermeture d'une application


Sujet :

C++/CLI

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Par défaut Fermeture d'une application
    Bonjour,

    J'ai écrit un programme qui doit exécuter quelques actions quand on l'arrête.

    Cela marche si on fait "Fichier", puis "Quitter".

    Mais je ne trouve pas comment intercepter la croix pour faire la même chose si on clique sur la croix ...

    Si quelqu'un peut me renseigner ce serait sympa.

    Bonne journée
    Jean-Louis.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Entre autres, tu peux traiter l'événement FormClosing. Mais il doit y avoir d'autres événements un peu plus tôt qui seraient peut-être plus appropriés...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Entre autres, tu peux traiter l'événement FormClosing. Mais il doit y avoir d'autres événements un peu plus tôt qui seraient peut-être plus appropriés...

    Merci Médinoc,

    J'ai déjà essayé, cela ne marche pas car j'envoie des ordres sur un port COM pour arrêter des appareils et j'utilise un timer pour séquencer les ordres et la séquence ne marche pas alors que cela fonctionne très bien en faisant "Fichier" "Quitter". J'ai l'impression que le timer se fait tuer avant d'avoir commencer à travailler.

    Bonne journée

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 38
    Par défaut
    Tu le fais bien avant le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if( components )
       delete components ;
    de la fonction "~Form1()".

    Dès que le soft va passer sur "delete components", plus rien ne fonctionnera. Donc il faut tout finir avant, quite à mettre un "while( pasfini )" juste avant le "delete components".

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    De plus, le if ne sert à rien: delete sur nullptr est garanti ne rien faire par le standard.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Par défaut
    Citation Envoyé par sepullayer Voir le message
    Tu le fais bien avant le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if( components )
       delete components ;
    de la fonction "~Form1()".

    Dès que le soft va passer sur "delete components", plus rien ne fonctionnera. Donc il faut tout finir avant, quite à mettre un "while( pasfini )" juste avant le "delete components".

    Ben oui, je le mets bien avant. On dirait qu'il se passe des choses, mais je ne sais pas quoi et en tous cas mes trucs ne s'arrêtent pas

    Bonne soirée

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 38
    Par défaut
    Et quand tu mets des points d'arrêts, ton soft passe aux mêmes endroits en cliquant sur le croix ?


    Essaye de mettre le contenu de ta fonction QuitterClicEvent(...), dans une fonction FermerMesCOM(), et de mettre Form1->Close(); dans QuitterClicEvent(...), genre :

    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
    // Destructeur de ta Form
    ~Form1()
    {
      FermerMesCOM(); // Ta fonction, qui doit être bloquante
     
      if( components )
        delete components;
    }
     
    // Fonction bloquante qui communique avec tes appareils
    void FermerMesCOM( void )
    {
      ...
    }
     
    // L'événement généré par Fichier->Quitter
    void QuitterClicEvent( ... ) // Les ... c'est pas significatif hein.
    {
      Form1->Close();
    }
    Met des points d'arrêt de partout, regarde ce qu'il se passe. Mais si ta fonction FermerMesCOM est vraiment bloquante il n'y a pas de raison que ça ne fonctionne pas.
    Tu peux aussi vérifier que tu n'as pas déjà arrêté ton timer ou détruis je ne sais quoi.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Par défaut
    Voici ce que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		~Form1()
    		{
    			Appli_Close ();
     
    			if (components)
    			{
    				delete components;
    			}
    		}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private: System::Void Appli_Close () 
    		 { 
                             compt_arret = 0;
                           timer_arret->Interval = 200;
    			 timer_arret->Enabled = true;
    			 while (compt_arret < 81)
    			 {
    			 }
    		 }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private: System::Void timer_arret_Tick(System::Object^  sender, System::EventArgs^  e) {
    	if (compt_arret > 80)
    	{
    		Close ();
    	}
    	else if (compt_arret <81)
    	{
    		Stop_Instrument (compt_arret);   
    		StripStatusLabel1->Text = "Patientez procédure d'arrêt en cours";
    		StripStatusLabel2->Text = String::Concat ("Arrêt Instrument n°", compt_arret.ToString());
                   compt_arret ++;
    	}				
    }
    Quand on clique sur le croix, le programme ne répond plus, j'ai l'impression qu'il reste dans la boucle while {} sans donner la main au timer ...

    Le problème n'existe pas quand j'appelle Appli_Close () dans quitterToolStripMenuItem_Click à condition de virer la boucle while qui est alors inutile !!
    Mais ça bloque aussi si je laisse la boucle while.

    C'est peut-être normal, pourquoi le timer reprendrait la main?
    Y a t-il des priorités ?

    Bonne journée et encore merci pour l'aide.

    Jean-Louis

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 38
    Par défaut
    Quand on clique sur le croix, le programme ne répond plus, j'ai l'impression qu'il reste dans la boucle while {} sans donner la main au timer ...
    Bon, juste pour expliquer pourquoi cette solution ne fonctionne pas :

    Déjà, quand tu sais pas ce que fais ton programme, tu peux mettre des points d'arrêts à l'entrée de chacune de tes fonctions, de manières à savoir exactement par où passe le soft, et donc ce qu'il fait.

    Ensuite tu fais un "while( compt_arret < 81 )", soit 81 * 200ms = 16.2s. C'est un while() sur l'execution d'une form, donc 16.2 secondes pendant lesquelles l'apparence de ta fenêtre ne sera plus raffraîchit. D'où :
    le programme ne répond plus
    Enfin,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (compt_arret > 80)
    	{
    		Close ();
    	}
    ne doit pas se trouver là. En effet "Close()" appelle "~Form1()", tu vois le problème ? Pas besoin de faire ça. dès que tu lachera ton while( compt_arret < 81 ) ta fenêtre se fermera toute seule.


    Bon ça c'était juste pour expliquer pourquoi ce soft ne fonctionne pas, mais le problème c'est ton while() qui est trop long pour faire ça comme ça.

    Ton problème (entre fichier->quitter et la croix ), c'est qu'avec fichier->quitter, c'est toi qui décide de quoi faire sur QuitterClic, et pas obligatoirement quitter, afficher du texte... . Alors que quand tu fais quitter avec la croix ça appelle directement "~Form1()".
    Ce que tu dois faire, c'est intercepter l'événement FormClosing ou Application_Exit, annuler la fermeture, et lancer ta propre fermeture avec ton timer, et cette fois-ci surtout ne pas enlever ton "Close()".

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Par défaut
    Citation Envoyé par sepullayer Voir le message
    Ce que tu dois faire, c'est intercepter l'événement FormClosing ou Application_Exit, consommer cet événement (pour annuler la fermeture), et lancer ta propre fermeture avec ton timer, et cette fois-ci surtout ne pas enlever ton "Close()".

    Merci pour l'explication qui est très claire et qui correspond parfaitement à ce que je pense.

    Maintenant comment annuler la fermeture en interceptant FormClosing?
    J'ai déjà essayé d'utiliser l'évènement FormClosing, mais je n'arrive pas à annuler la fermeture ...

    Bonne soirée et merci encore

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 38
    Par défaut
    Citation Envoyé par jlg_47 Voir le message
    Maintenant comment annuler la fermeture en interceptant FormClosing?
    J'ai déjà essayé d'utiliser l'évènement FormClosing, mais je n'arrive pas à annuler la fermeture ...
    Ah pardon, j'avais pas compris ce qui te bloquait. C'est très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Void Form1_FormClosing(Object^  sender, FormClosingEventArgs^  e) 
    {
      if( PeripheriqueFermees == false ) // Flag pour éviter de tourner en boucle
      {
        e->Cancel = true;  // Edit : c'est ça qui te permet d'annuler la fermeture
        Appli_Close ();    // Ta fermeture a toi
      }
      // else, tu laisses la fenêtre se fermer
    }
    et dans ta fonction tu rajoutes la mise à 1 du flag
    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
    private: System::Void timer_arret_Tick(System::Object^  sender, System::EventArgs^  e) 
    {
      if (compt_arret > 80)
      {
        PeripheriqueFermees = true;
        Close ();
      }
      else if (compt_arret <81)
      {
        Stop_Instrument (compt_arret);   
        StripStatusLabel1->Text = "Patientez procédure d'arrêt en cours";
        StripStatusLabel2->Text = String::Concat ("Arrêt Instrument n°", compt_arret.ToString());
        compt_arret ++;
      }				
    }
    Par contre du coup il faut enlever Appli_Close() de ta fonction QuitterClicEvent(), et le remplacer simplement par Close().

    Au lieu d'utiliser le flag tu peux aussi désassigner l'événement FormClosing.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Par défaut
    Citation Envoyé par sepullayer Voir le message
    Ah pardon, j'avais pas compris ce qui te bloquait. C'est très simple :

    Merci beaucoup, ça marche comme je veux

    Super ce forum, on apprend des choses tous les jours

    Bonne soirée

    Jean-Louis

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

Discussions similaires

  1. Fermeture d'une application éxterne
    Par Matt2094 dans le forum Langage
    Réponses: 8
    Dernier message: 22/03/2006, 15h11
  2. Forcer la fermeture d'une application
    Par Bissada dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2005, 21h42
  3. fermeture d'une application après un temp d'inactivité?
    Par sitdown dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 24/08/2005, 15h44
  4. Détection de la fermeture d'une application
    Par vanitom dans le forum MFC
    Réponses: 6
    Dernier message: 19/08/2005, 18h11
  5. [Event]Annuler la fermeture d'une application
    Par willowII dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 16/11/2004, 09h28

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