Comment arrrêter un thread Bgw1 (backgroundworker1) et démarer un autre bgw2 , .

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:51
DxShadow Messages postés 69 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 12 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. :)

1 réponse

DxShadow Messages postés 69 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 12 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


Cordialement,
DxShadow
0
Rejoignez-nous