Comment séparer l'execution de deux Backgroudworker ?

cs_jasonray16 Messages postés 14 Date d'inscription mercredi 25 mai 2011 Statut Membre Dernière intervention 20 juin 2011 - 15 juin 2011 à 21:53
NHenry Messages postés 15123 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 20 mai 2024 - 20 juin 2011 à 21:14
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 :

'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:
'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. :)

3 réponses

NHenry Messages postés 15123 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 20 mai 2024 159
15 juin 2011 à 22:36
Bonjour,

En regardant rapidement ton code, je constate que tes 2 BGW utilisent la même liaison série.
De base quand tu as 2 threads qui accèdent à la même ressources, il faut arbitrer les conflits.

Essayes de mettre une variable qui sera lisible des 2 BGW, mais attention, regardes du coté de VolatileWrite et VolatileRead (recherche sur internet), car sinon, les verrous ne seront pas efficace.

Sinon, essayes de repenser ton code pour n'avoir plus qu'un thread qui accède à la ressource ou alors, fais en sorte que l'un des 2 threads n'attende pas de réponse.

Mon site
0
cs_jasonray16 Messages postés 14 Date d'inscription mercredi 25 mai 2011 Statut Membre Dernière intervention 20 juin 2011
15 juin 2011 à 23:17
merci

Bon ,pour la variable à mettre,je pense c'est déja fait ,c'est les label,qui sont déclarer en string en quelque sorte dans le delegate non?
0
NHenry Messages postés 15123 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 20 mai 2024 159
20 juin 2011 à 21:14
Bonjour,

Désolé pour le délai de réponse, mais j'ai eu une semaine chargée.

Oui, il faut soit utiliser un Timer qui mettra à jour les Labels
Soit utiliser des Delegates pour éviter les exceptions CrossThreadExceptions.

Mon site
0
Rejoignez-nous