Comment séparer l'execution de deux Backgroudworker ?
cs_jasonray16
Messages postés14Date d'inscriptionmercredi 25 mai 2011StatutMembreDernière intervention20 juin 2011
-
15 juin 2011 à 21:53
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 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. :)
A voir également:
Comment séparer l'execution de deux Backgroudworker ?
NHenry
Messages postés15102Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention27 mars 2024159 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.