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 397
    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 397
    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 397
    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 397
    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