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

Dotnet Discussion :

[VB.NET]Arrêter un traitement


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Subkill
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 174
    Par défaut [VB.NET]Arrêter un traitement
    Bonjour,

    J'ai un bouton Démarrer et un bouton Arrêter.

    Quand je clique sur mon bouton démarrer, un traitement s'exécute. (Connexion a 2 bds pour la copie d'une table d'une BD à l'autre, etc...)

    Une fois que je clique sur le bouton Démarrer ma fênetre gèle et il m'est impossible de cliquer sur Arrêter pour interrompre le traitement jusqu'attend que la copie de toutes les tables soit faite.

    Comment puis laisser ma fenêtre active?

    Merci

  2. #2
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Tu devrais éssayer le BackgroundWorker, cf:
    http://glarde.developpez.com/dotnet/bgworker/vb/

  3. #3
    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 : 43
    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
    Par défaut
    Plus précisément: quand on clique sur Démarrer tu fais exécuter le traitement par le BackgroundWorker. Ca exécute dans un nouveau thread, donc ça ne gèle pas ta form. Quand on clique sur arrêter, tu dis au BackgroundWorker d'arrêter le traitement.
    Exemple avec un traitement bidon (c'est en C#, mais tu dois pouvoir traduire en VB.NET sans trop de mal...
    Code C# : 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
        public partial class Form2 : Form
        {
            private BackgroundWorker worker;
     
            public Form2()
            {
                InitializeComponent();
                worker = new BackgroundWorker();
                worker.DoWork += new DoWorkEventHandler(Traitement);
                worker.WorkerSupportsCancellation = true;
                worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
            }
     
            void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                MessageBox.Show(e.Result.ToString());
            }
     
            private void btnStart_Click(object sender, EventArgs e)
            {
                worker.RunWorkerAsync();
            }
     
            private void btnStop_Click(object sender, EventArgs e)
            {
                worker.CancelAsync();
            }
     
            private void Traitement(object data, DoWorkEventArgs e)
            {
                // traitement bidon...
                StringBuilder sb = new StringBuilder();
     
                // On vérifie si la fin du traitement a été demandée
                while (!worker.CancellationPending)
                {
                    sb.Append("x");
                    Thread.Sleep(100);
                }
     
                e.Result = sb.ToString();
            }
        }

  4. #4
    Membre confirmé Avatar de Subkill
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 174
    Par défaut
    Merci à vous deux!

    Mais si j'ai bien compris, chaque fois que je veux modifier un élément de l'interface(label, textbox, listbox, progressBar, infoBar,etc.) je dois le faire dans un nouveau thread? Si il y a un autre moyen, je serais bien content de l'apprendre, car ma fenêtre contient au moins une 10 d'élément à modifier...

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par Subkill Voir le message
    Merci à vous deux!

    Mais si j'ai bien compris, chaque fois que je veux modifier un élément de l'interface(label, textbox, listbox, progressBar, infoBar,etc.) je dois le faire dans un nouveau thread? Si il y a un autre moyen, je serais bien content de l'apprendre, car ma fenêtre contient au moins une 10 d'élément à modifier...
    J'ai beaucoup de mal à comprendre la relation entre ce que tu décrits là et ton premier poste. Tu peux préciser ????

  6. #6
    Membre confirmé Avatar de Subkill
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 174
    Par défaut
    Oui bien sur:

    Quand je clique sur démarrer, la copie de la bd1 vers la bd2 s'effectue. Mais j'indique dans un barre d'information l'état d'avancement de la copie, ainsi qu'avec une barre de progression. Aussi pour chaque copie de table, son nom s'ajoute dans un listbox. (voir la pièce jointe)


    Depuis que j'ai rajouter le Backgroundworker pour exécuter mon traitement, chaque fois que je veux modifier l'interface, je recois le message suivant:
    "Cross-thread operation not valid: Control 'lblCopie' accessed from a thread other than tje tjread it was created on."

    Je dois alors créer un nouveau thread pour chacune des modifications à l'interface.
    Images attachées Images attachées  

  7. #7
    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 : 43
    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
    Par défaut
    Citation Envoyé par Subkill Voir le message
    Merci à vous deux!

    Mais si j'ai bien compris, chaque fois que je veux modifier un élément de l'interface(label, textbox, listbox, progressBar, infoBar,etc.) je dois le faire dans un nouveau thread? Si il y a un autre moyen, je serais bien content de l'apprendre, car ma fenêtre contient au moins une 10 d'élément à modifier...
    Non, pas vraiment... en fait le seul thread qui a le droit de modifier les éléments de l'interface graphique est celui qui a créé la Form. D'après la doc:
    You must be careful not to manipulate any user-interface objects in your DoWork event handler. Instead, communicate to the user interface through the ProgressChanged and RunWorkerCompleted events.
    Autrement dit, ton traitement ne doit pas modifier directement la Form, mais il peut dire au thread de la Form de le faire, via les évènements ProgressChanged (en appelant ReportProgress en cours de traitement) et RunWorkerCompleted (quand le traitement est fini). Dans les handlers de ces évènements, tu peux modifier les éléments de l'interface car ils sont exécutés dans le thread de la Form.

  8. #8
    Membre confirmé Avatar de Subkill
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 174
    Par défaut
    Wouins, c'est ça que j'avais compris. Malheureusement cette solution n'est pas intéressante, puisque je ne contrôle pas les événements ProgressChanged et RunWorkerCompleted.
    Je vais rester avec la création de nouveau thread, c'est plus long, mais je vais avoir le plein contrôle de mon application.

    Merci encore

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

Discussions similaires

  1. Arrêter un traitement
    Par ruda.tom dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/05/2008, 10h36
  2. Arrêter un traitement BackGroundWorked
    Par bubulemaster dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/04/2008, 22h06
  3. [.NET 2.0] Traitement graphique Lourd, exécuter dans un autre thread?
    Par jazz matazz dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 28/04/2007, 23h42
  4. [C++/VB.Net]Optimiser des traitements lourds
    Par NiamorH dans le forum Windows Forms
    Réponses: 8
    Dernier message: 28/05/2006, 10h03
  5. [C#] [VS.NET] Arrêter le système
    Par patdez dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/07/2004, 14h35

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