none
Comment séparer l'execution de deux backgroundworker ? à lire l'explication et le code correspondant merci RRS feed

  • Question

  • 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. :)
    mercredi 15 juin 2011 20:05

Réponses

  • Bonjour,

    Ne serait-il pas plus simple d'utiliser http://msdn.microsoft.com/fr-fr/library/system.io.ports.serialport.datareceived.aspx qui récupère déjà les données en arrière plan ?

    Sinon c'est un peu difficile de partir dans une direction donnée quand plusieurs approches sont exposées (sans que les erreurs correspondants à ces approches soient indiquées). Donc si DataReceived ne convient pas, je suggère de choisir l'approche qui vous semble la plus proche de celle que vous souhaitez au final (et une seule) et d'indiquer quel est exactement (message d'erreur et ligne où elle survient) le problème qui survient.

    Je crois comprendre que l'on veut interroger plusieurs périphériques sur un seul port. Je pense que l'on pourrait avoir un seul background worker qui enverrait une demande et attendrait la réponse (avec éventuellement un timeout ?) dans une boucle. Je pense que les données arrivent dans le désordre car les périphériques ne vont pas forcément répondre dans l'ordre ou les demandes ont été envoyées.

    Je n'ai jamais fait grand chose avec les ports séries (je suis même surpris que l'on puisse interroger plusieurs périph avec un seul port ? Si c'est possible il serait sans doute plus simple d'avoir un périphérique par port ou d'interroger les périphériques les uns apèrs les autres (demande + attente de la réponse avant de passer au suivant)).

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    jeudi 16 juin 2011 12:22
    Modérateur