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

VB.NET Discussion :

Comment séparer l'execution de deux backgroundworker


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Comment séparer l'execution de deux backgroundworker
    Bonjour,
    Voila mnt depuis pas mal de temps je fais mes essais avec le backgroundworker , pour réaliser la communication avec le port série vers deux périphériques : voila le code :

    Code vb : 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
     
    'déclencher le bgw1
     Private Sub AutoSingleToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AutoSingleToolStripMenuItem.Click
             Me.BackgroundWorker1.RunWorkerAsync()
        End Sub
     
    'LABEL du 1er débitmètre
        Private Sub SetTextBoxText(ByVal text As String)
            Me.Label13.Text = text '.Substring(4)
        End Sub
    'LABEL du 2éme débitmètre
        Private Sub DB2Text(ByVal text As String)
            Me.Label14.Text = text '.Substring(4)
        End Sub
     
    Private Delegate Sub SetTextBoxTextDelegate(ByVal text As String)
    Private Delegate Sub DB2TextDelegate(ByVal text As String)
     
    'bgw1_do_work
        Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            If com1.IsOpen = False Then
                com1.Open()
            End If
            Do
                com1.Write("!11,f" & ControlChars.Cr)
     Me.Invoke(New SetTextBoxTextDelegate(AddressOf SetTextBoxText), com1.ReadLine() & ControlChars.CrLf)
                com1.Write("!12,f" & ControlChars.Cr)
     Me.Invoke(New DB2TextDelegate(AddressOf DB2Text), com1.ReadLine() & ControlChars.CrLf)
     
            Loop
    End sub

    Voila,jusqu'à là,mon programme fonctionne normalement, je reçois les données de mes deux périphériques.Pourquoi "do loop"? parce que je veux envoyer une requête à chaque fois et recevoir la donnée qui change en temps réel..voila

    Mon problème c'est que ,je voulais ajouter 3 autres périphériques j'ai essayer la même syntaxe entre la boucle "do loop",en ajoutant les 3 requête , ,mais y'a un bug à chaque fois ,j'ai pas compris pk en revanche si j'essaye les 3 syntaxe DANS LA BOUCLE "DO LOOP" sans les deux anciennes requêtes ça fonctionne mais pendant un petit moment,...
    c'est pour cela ,j'ai réfléchi à ajouter un 2ème Backgroundworker(bgw2) ,qui exécutera que les 3 autres requête, j'ai essayer d'utiliser les deux Bgw en même temps mais y'a tjrs ce problème de bug et chevauchement de données....
    voila le programme du 2ème bgw:
    Code vb : 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
     
    'T1
     Private Sub T1Text(ByVal text As String)
            Me.Label16.Text = text
     
        End Sub
        'T2
        Private Sub T2Text(ByVal text As String)
            Me.Label18.Text = text
     
        End Sub
        'T3
        Private Sub T3Text(ByVal text As String)
            Me.Label19.Text = text
     
        End Sub
    Private Sub BackgroundWorker2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker2.DoWork
    Do
            com1.Write("!13,f" & ControlChars.Cr)
            Me.Invoke(New T1TextDelegate(AddressOf T1Text), com1.ReadLine() & ControlChars.CrLf)
            com1.Write("!14,f" & ControlChars.Cr)
            Me.Invoke(New T2TextDelegate(AddressOf T2Text), com1.ReadLine() & ControlChars.CrLf)
            com1.Write("!15,f" & ControlChars.Cr)
            Me.Invoke(New T3TextDelegate(AddressOf T3Text), com1.ReadLine() & ControlChars.CrLf)
    Loop
        End Sub
     'executer bgw2
        Private Sub AfficherTempératuresToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AfficherTempératuresToolStripMenuItem.Click
            BackgroundWorker1.CancelAsync()
            If com1.IsOpen Then
                Me.BackgroundWorker2.RunWorkerAsync()
            Else
                com1.Open()
                Me.BackgroundWorker2.RunWorkerAsync()
            End If
     
     
        End Sub

    mnt ,les questions sont :

    1-comment arrêter le premier bgw1 pour exécuter le deuxième bgw2 séparément ?
    j'ai un problème avec la boucle "do loop" je sais ,qui ne me permet pas de compléter la tache du bgw1,mais je peux pas faire autrement,...breff comment l'arrêter d'un coup si possible?
    2-Es que le problème de chevauchement et réception de données,vient de la partie SOFT,es que y'a une quelconque erreur de programmation?

    Voila merci d'avance pour vos réponses.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    mauvaise implémentation de l'utilisation du port com
    sur un même port si tu as 2 threads qui écrivent dessus, ca va pas etre évident de déterminer pour qui est la réponse, donc l'utilisation d'un seul thread est à privilégier

    de plus pour de la com on utilise en général un thread plutot qu'un backgroundworker, mais je pense pas que ca soit très génant

    un thread.sleep pourrait surement soulager le processeur pour le même résultat

    cancelasync ne fait rien, il met juste un booléen à true (cancelationpending ou un truc dans le genre), c'est à toi de le tester pour faire la sortie du DoWork

    lire un port com et écrire dans le textbox le résultat c'est pas génial non plus
    il faut une classe qui stocke les données, la com écrit dedans, et un timer vient lire les données de la classe pour les afficher sur l'interface
    sur la classe tu peux mettre quelques propriétés genre CommandToSend, EtatConnection, Valeur
    et après tu fais une boucle sur chaque instance et tu utilises la propriété CommandToSend pour savoir quoi envoyer ; ca fait du code plus générique et plus maintenable

    pas de try/catch = grosse erreur

    ne pas mettre des lignes de code pour rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If com1.IsOpen Then
        Me.BackgroundWorker2.RunWorkerAsync()
      Else
        com1.Open()
        Me.BackgroundWorker2.RunWorkerAsync()
    End If
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If not com1.IsOpen Then    com1.Open()
    Me.BackgroundWorker2.RunWorkerAsync()
    avoir une sub et un délégué par textbox c'est pareil, une sub suffirait si elle demande le textbox et le text

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    mauvaise implémentation de l'utilisation du port com
    sur un même port si tu as 2 threads qui écrivent dessus, ca va pas etre évident de déterminer pour qui est la réponse, donc l'utilisation d'un seul thread est à privilégier

    de plus pour de la com on utilise en général un thread plutot qu'un backgroundworker, mais je pense pas que ca soit très génant

    un thread.sleep pourrait surement soulager le processeur pour le même résultat

    cancelasync ne fait rien, il met juste un booléen à true (cancelationpending ou un truc dans le genre), c'est à toi de le tester pour faire la sortie du DoWork

    lire un port com et écrire dans le textbox le résultat c'est pas génial non plus
    il faut une classe qui stocke les données, la com écrit dedans, et un timer vient lire les données de la classe pour les afficher sur l'interface

    pas de try/catch = grosse erreur

    ne pas mettre des lignes de code pour rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    If com1.IsOpen Then
        Me.BackgroundWorker2.RunWorkerAsync()
      Else
        com1.Open()
        Me.BackgroundWorker2.RunWorkerAsync()
    End If
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    If not com1.IsOpen Then    com1.Open()
    Me.BackgroundWorker2.RunWorkerAsync()

    Merci pour la réponse

    c'est vrai je sais qu'il y'a des erreurs ,mais je ne suis pas informaticien ou programmeur , j'ai pas cet instint du programmeur ,...
    Pour le "try catch" je savais que c'était quelque chose que je devais utiliser ,mais je savais pas comment....alors si vous avez quelque chose à proposer je dirai pas non

    Es que le backgroundworker = un thread ?

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    le backgroundworker est bien un thread, mais une classe de plus haut niveau que le simple system.threading.thread (qui est plus compliqué à utiliser dans certains cas)

    si tu n'est pas informaticien, pourquoi fais tu un programme ?
    si c'est un besoin ponctuel pour 3 lignes de code dis nous ce qu'il te faut et on te le fais en 2 minutes

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    le backgroundworker est bien un thread, mais une classe de plus haut niveau que le simple system.threading.thread (qui est plus compliqué à utiliser dans certains cas)

    si tu n'est pas informaticien, pourquoi fais tu un programme ?
    si c'est un besoin ponctuel pour 3 lignes de code dis nous ce qu'il te faut et on te le fais en 2 minutes

    Merci

    Non,au fait je suis plutôt Électronicien ,j'ai une petite base dans la programmation,....mais je pense que tout ça c'est purement un truk d'informaticien et programmeur....breff
    j'en ai besoin pour mon projet , comme c'est expliqué déjà avant , c'est pour communiquer avec certains périphériques,...
    mais pour l'instant je communique qu'avec deux périphérique assez normalement ( puisque il me manque la petite partie pour l'arrêt du bgw)
    --> pourquoi je cherche l'arrêt du Bgw....parce que je veux en quelque sorte ,balancer entre les bgw(les thread),comme ça, j'écouterai le port série en quelque sorte à chaque fois qu'il y'a une donnée à afficher ou recevoir ,et il y'aurai pas de conflit dans ce cas je pense?

    -->Quand je dis BALANCER, je veux dire, communiquer avec un bgw à chaque appui d'un bouton par exemple,l'appui,arrêtera par exemple,le bgw1,et exécutera le bgw2,comme ça j'éviterai d'écouter le port 2 fois de suite....et créer ce conflit que j'ai....

    On ma diriger vers le "Volatileread et volatilewrite" , je sais si ça vous dis quelque chose?,moi je sais pas j'essaye de documenter sur ça

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    pour arreter un backgroundworker, il faut sortir de la sub qui gère le DoWork
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Do
     
    Loop Until bgw1.cancellationpending = true
    appeler bgw1.cancelasync va passer le booléen à true, et le do loop va s'arreter
    tu peux alors lancer bgw2.runworkerasync et faire de même pour l'arrêter

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2011
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    pour arreter un backgroundworker, il faut sortir de la sub qui gère le DoWork
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Do
     
    Loop Until bgw1.cancellationpending = true
    appeler bgw1.cancelasync va passer le booléen à true, et le do loop va s'arreter
    tu peux alors lancer bgw2.runworkerasync et faire de même pour l'arrêter

    et bah ,ça à l'air de marcher ? c'est ce que je cherchais, reste à essayer ça avec les périphérique au labo....
    j'utilise le premier bgw1 je lis ,ensuite,quand je fais appel au bgw2 ,ça s'arrête...,..bon c'est qu'une première approche,...

Discussions similaires

  1. Réponses: 6
    Dernier message: 31/08/2012, 15h44
  2. GUI & App : comment séparer les deux choses
    Par raboliot dans le forum wxPython
    Réponses: 1
    Dernier message: 14/03/2007, 12h00
  3. comment filtrer une table avec deux criteres càd 2 colonnes
    Par athmane2dz dans le forum Bases de données
    Réponses: 7
    Dernier message: 28/07/2004, 15h25
  4. [Debutant] comment creer un Executable avec Jbuilder
    Par JavaEli dans le forum JBuilder
    Réponses: 10
    Dernier message: 29/03/2004, 11h22
  5. Comment créer et executer un .EXE
    Par maher12 dans le forum Flash
    Réponses: 3
    Dernier message: 26/09/2002, 08h33

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