Comment arrrêter un thread Bgw1 (backgroundworker1) et démarer un autre bgw2 , .
cs_jasonray16
Messages postés14Date d'inscriptionmercredi 25 mai 2011StatutMembreDernière intervention20 juin 2011
-
15 juin 2011 à 21:51
DxShadow
Messages postés69Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention12 mai 2013
-
20 juin 2011 à 22:05
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 arrrêter un thread Bgw1 (backgroundworker1) et démarer un autre bgw2 , .
DxShadow
Messages postés69Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention12 mai 2013 20 juin 2011 à 22:05
Salut,
faut activer l'option WorkersSupportsCancellation (mettre à True) dans les propriétés du contrôle.
Ou dans Do Loop tu entres
Do Until StopProcess = False
'Code dans le Do Loop du background worker
Loop
Tu dois bien évidemment déclarer StopProcess en tant que Booléen dans les déclarations publiques de valeurs:
Public StopProcess As Boolean = False
(entre Class Form1 et End Class, hein! )
Puis tu dois faire un bouton déclencheur (je vais mettre ici le code à mettre dans l'évènement Click du bouton que tu auras créé dans l'IDE):
StopProcess = Not StopProcess 'Permuter False/True
If StopProcess = False Then bgw1.RunWorkerAsync()
Ce bouton déclenchera bgw1 ou le stoppera, pour stopper/(re)lancer l'opération.
Stopper un backgroundworker :
If bgw1.IsBusy = True Then bgw1.CancelAsync
En dernier, un évènement qui se déclenche dès la fin d'opération d'un backgroundworker existe. C'est l'évènement RunWorkerCompleted, je ne sais pas s'il est appelé en cas de stop avec CancelAsync... Enfin bon, je crois que j't'ai donné les clefs essentielles ;D pour ton problème n°2, je pense que VB.NET plante avec ces satanés BackgroundWorker. Je ne les utilise plus: ils sont trop instables, et ont une fois foutu en l'air un projet très pointu sur lequel j'avais passé des aprems entiers y'a deux ans!!! ces contrôles sont des dangers publics (ou alors c'est une question de lenteur ? je sais pas)
J'utilise de toute évidence plutôt des Timers, désormais. ça fait rétro, mais c'est fonctionnel et tu peux accéder aux contrôles (les backgroundworkers fonctionnent dans des Threads séparés depuis .NET Framework 2.0 inclu et ne peuvent donc pas accéder au Thread du form !!!). Bon bon voilà j'espère que ça t'aide