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

Visual C++ Discussion :

Implémentation d'un bouton "Annuler" pour interrompre un calcul en cours


Sujet :

Visual C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Par défaut Implémentation d'un bouton "Annuler" pour interrompre un calcul en cours
    Bonjour à tous,

    Je suis nouveau sur ce site, où je trouve beaucoup d'informations me permettant d'avancer dans mon travail. Merci pour celà.

    Je developpe des applications mathétiques dans le domaine de la biologie, et je travaillais en Fortran (non, ne huez pas, c'est très pratique) jusque récemment, où j'ai décidé de passer en visual C++ pour implémenter des GUI.

    J'en viens donc à mon problème.

    1- j'ai développé en C++ un code pour effectuer un calcul;

    2- afin de pouvoir lancer ce calcul à partir d'une interface graphique permettant de paramètrer le modèle mathématique, j'ai implémenter ce code dans une application Forms: concrétement, j'ai commencé par créer une Form, puis un bouton "Calcul", qui lance evidemment mon calcul;

    3- ce calcul est constitué principalement d'une boucle, et dans certain cas, il faut beaucoup de temps pour l'achever (résolution d'equations différentielles partielles).

    Implémenté avec mon bouton "Calcul", celà donne en résumé ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private: System::Void button1_Click(System::Object *  sender, System::EventArgs *  e)
    {
     
    for (int j=0;j<Ntime;j++)
    {
    'CALCUL'
    }
    }

    4- J'en viens à ma question. Je voudrai implémenter un bouton "Annuler", qui puisse après un click arrêter le calcul en cours, c'est à dire sortir de ma boucle. J'ai donc essayer ceci:

    * déclaration d'un booléen qui est égal à true si je clique sur "Annuler"



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    bool Annul;
     
    private: System::Void Annuler_Click(System::Object *  sender, System::EventArgs *  e)
    		 {		
    			 Annul=true;
    		 }
    * sortie conditionnelle de ma boucle

    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 button1_Click(System::Object *  sender, System::EventArgs *  e)
    {
     
    for (int j=0;j<Ntime;j++)
    {
    	if (Annul!=true)
    	{
    		break;
    	}
     
    'CALCUL'
    }
    }
    Bien evidemment, ça ne fonctionne pas, premiérement car je ne peux pas cliquer sur mon bouton "Annuler" pendant le calcul déclenché en cliquant sur le bouton "Calcul", et deuxiémement car je pense que cette approche n'est pas bonne, sans savoir y remédier avec mes faibles connaissances du Visual C++.

    Est ce que quelqu'un pourrait m'aider pour ce problème?

    Bien conscient que c'est une question de base et de "rookie", j'espère que mon explication est claire et que la question mérite un intérêt.

    Merci d'avance.

    MR

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 391
    Par défaut
    Bonjour

    Je sais juste qu'il faut dans ta fonction calcul vider la pompe a message pour que l'appuie sur ton bouton soit prie en compte pendant l'execution de ton calcul.
    Malheureusement je ne peux pas te donner le code en visual C++.

    Cordialement

  3. #3
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    je pense à mon humble avis qu'il faut plutot faire ton calcul dans un thread pour éviter de bloquer la gui.
    Ensuite depuis ton bouton annuler, arreter le thread

    tu devrais regarder du coté de la faq c++/cli, http://dotnet.developpez.com/faq/cpp...Multithreading
    Voir aussi les cours langage C et les cours pour apprendre C++.

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Par défaut
    Rebonjour

    Merci de vos réponses rapides.

    Je vais prendre en compte vos conseils, et lire la Faq sur les Threads. Je suis passé à côté , mais je crois que c'est exactement ce qu'il me faut.

    Merci beaucoup.

  5. #5
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    tiens, parce que je suis cool je t'ai fait une démo, qui fait aussi une mise à jour GUI depuis le thread
    Fichiers attachés Fichiers attachés

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 34
    Par défaut
    Bonjour,

    Merci beaucoup Nico pour ta demo et ton tuto (et tes tutos, car les autres m'ont également aidé pour démarrer).

    C'est exactement ce qu'il me fallait, et je pense que ça devrait aussi résoudre mon second problème qui était: le calcul était beaucoup plus lent depuis que j'avais implémenter le code de calcul sur mon bouton "Ok" (par rapport au calcul effectué sur la console). Et ça devrait aussi me permettre d'améliorer les fonctionnalités de ma GUI.

    Merci beaucoup pour cette aide, et pour l'accueil, et j'espère pouvoir un jour aider à mon tour, quand j'aurai surmonté l'apprentissage du Visual C++ (le passage de Fortran à C++ a déjà été un peu compliqué pour le changement de logique, et le passage en Visual encore plus, mais d'ici 1 an, ça devrait aller )

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