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 :

Arrêter une fonction en cours d'exécution


Sujet :

C++/CLI

  1. #1
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 184
    Points : 164
    Points
    164
    Par défaut Arrêter une fonction en cours d'exécution
    Bonjour,

    en faisant une interface graphique, je lance une série de fonctions (ou une seule selon le cas) en appuyant sur un bouton 1.
    J'essaie de disposer d'un second bouton 2 qui a pour but d'arrêter la ou les fonctions en cours.

    l'objectif est que pendant que la/les fonction(s) du boutton 1 sont en cours d'exécution, je puisse les arrêter à tout moment depuis un autre bouton.

    Auriez-vous d'une idée sur comment procéder pour cela?


    merci d'avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 173
    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 173
    Points : 12 302
    Points
    12 302
    Par défaut
    La méthode habituelle pour implémenter ce genre de fonctionnalité est le multi-threading.

    Quand l'utilisateur clique sur le bouton 1, le thread de l'IHM, celui généralement créer par le système d'exploitation au démarrage de l'application, ne fait que lancer un autre thread, dit thread de travail, qui s'exécutera en "parallèle" du thread d'IHM. C'est ce thread de travail qui fera effectivement l'action (calcul, accès base de donné, impression etc.)

    Ainsi, le thread d'IHM ne sera pas bloqué pendant l'exécution de l'action.

    Pour que l'exécution de l'action soit interruptible, il faut que le code de l'exécution vérifie régulièrement (aux étapes charnières de l'action) que le traitement doit être interrompu.
    Ainsi, le thread de travail pourra interrompre de manière propre et ordonné le traitement.

    Il ne reste qu'un moyen pour que le thread d'IHM communiquer au thread de travail le fait qu'il doit s'interrompre.

    Il y a l'embarra du chois, tout canal de communication inter-thread fait l'affaire.
    Moi, j'ai tendance à utiliser les Events.

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Voir aussi la FAQ C++ : http://cpp.developpez.com/faq/ et les cours et tutoriels pour apprendre la programmation C++ : http://cpp.developpez.com/cours/

  3. #3
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 184
    Points : 164
    Points
    164
    Par défaut
    Intéressant (merci pour la réponse) et les liens vers les cours C++ c'est parfait : http://cpp.developpez.com/cours/.

    j'avais tenté entretemps d'utiliser les threads mais mon code ne fonctionne plus correctement avec.

    Lorsque je lance un thread, la fonction (qui exécute d'autres fonctions) par derrière n'arrive plus à faire correctement des insert en ado.net sur SQL SERVER.
    Il s'arrête au bout de quelques secondes en ne faisant que qu'une partie des inserts.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ThreadStart ^myThreadDelegate = gcnew ThreadStart(this,&ImportMesures::Form1::lance_import);
    		trd = gcnew Thread(myThreadDelegate);
    		 trd->IsBackground = true;
    		 trd->Start()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public ref class Form1 : public System::Windows::Forms::Form
    {
    private: System::Threading::Thread ^trd;
    public:
    		Form1(void)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delegate void DelegateThreadTask();

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 173
    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 173
    Points : 12 302
    Points
    12 302
    Par défaut
    Les 2 threads doivent être le plus étanche possible vis à vis des données.

    Vous devez, autant que possible, fournir toute les données au worker thread et ne pas les partager avec le thread d'IHM.

    Passer une référence sur un objet graphique, comme un formulaire, c'est pas bon.
    Les objets graphiques ne sont pas thread-safe.
    Ils ne supportent pas que plusieurs threads appels leurs méthodes ou modifient leurs données.

    Partager un event est bien plus safe que de partager des objets graphiques.

    Vous risquez le deadlock en appelant des méthodes d’objets graphiques depuis un worker thread.

  5. #5
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    184
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 184
    Points : 164
    Points
    164
    Par défaut
    Je suis un peu dépassé car je suis assez néophyte sous visual c++.net

    j'ai fait des changement et là j'ai un message d'erreur

    Error 1 error C3350: 'System::Threading::ThreadStart' : a delegate constructor expects 1 argument(s) 635

    la fonction appellée est maintenant dans un autre fichier et j'ai réécrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     ThreadStart ^myThreadDelegate = gcnew ThreadStart(this,&lance_import);
    		trd = gcnew Thread(myThreadDelegate);
    		 trd->IsBackground = true;
    		 trd->Start();
    sinon, là, je suis un peu perdu dans la manière de comment m'y prendre.

Discussions similaires

  1. Affichier une "UserForm" sans arrêter la fonction en cours, possible ?
    Par Pierre.g dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/08/2008, 22h22
  2. Réponses: 4
    Dernier message: 07/11/2006, 11h28
  3. Réponses: 2
    Dernier message: 24/08/2006, 10h46
  4. Arrêter une requête en cours
    Par Krapulax dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 09/09/2004, 09h54
  5. Créer une fonction mathématique pendant l'exécution
    Par zeprogrameur dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2004, 11h36

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