IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Thread et port com


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut Thread et port com
    Bonjour à tous et à toutes.

    J'aimerai exposer un problème qui est le suivant.
    J'ai un moyen de récupérer les données d'un appareil de mesure sur un port com émule. Pas de soucis je récupéré la trame. Mais tant qu'on fait des mesure je récupère une trame. le soucis et que je veux un bouton pour dire c'est bon j'ai assez récupérer de point de mesures. Cependant du fait que je suis dans une boucle du thread principale je ne peut plus cliquer sur le form.
    ET donc j'ai tenter bien des choses par exemple que la lecture du port com sur un thread à part mais la du coup j'arrive plus a afficher dans une listbox les points de mesures ( vu que c'est sur un autre thread).
    y a t 'il moyen de passer la valeur d'un thread secondaire au thread principal ?

    cdt

  2. #2
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut Mutlitâches
    Je ne suis pas trop au courant des difficultés engendrées par l'usage du multithreading mais j'ai dû travailler cette matière il y a quelques années ...
    C'est ainsi que je dispose de quelques cours et je t'en envoie 2 extraits.

    Le fichier Thread.pdf concerne l'échange d'informations entre threads (ce ne sera sans doute pas suffisant pour ton problème, à voir ...).
    Le fichier Marshal.pdf concerne la communication d'une même interface avec plusieurs threads (tu devrais pouvoir y trouver des pistes de solutions " ... Il est possible d'encoder d'autres valeurs avant même que le traitement initial ait terminé ses itérations. ...", mais bon courage ...).

    Pièce jointe 409849Pièce jointe 409851

  3. #3
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Je regarde ton tuto sur le multithread mais je m'embrouille un peu.
    En tout cas je te remercie d'avance de l'aide apporté si je trouve une solution avec cela je la posterai.
    cdt

  4. #4
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Bon,
    Je suis une quille avec le multithread
    J'arrive a faire l'acquisition mais je n'arrive pas a mettre à jour l'affichage dans le thread principal
    Peut on traiter sans multi thread ? ( bien que j'aimerai quand meme y arriver avec)

  5. #5
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Perso, je m'efforcerais de faire cela sans programmer le multithreading. Si j'ai répondu dans le sens "multithreading", c'est parce que le message initial (le #1 du 7/9) traitait de threads ...
    Je pense qu'il est possible de lire les données arrivant sur un port série et de les transmettre directement dans une ListBox, par exemple. En fait, il faut savoir avec quoi (quelle librairie, quelle méthode) tu lis les données.
    Un le clic d'un bouton devrait être "entendu" entre 2 affichages dans la ListBox.
    J'ai connu une application qui servait totalement d'interface à un theodolite simplement connecté par le port série, je n'ai malheureusement plus le code ...

  6. #6
    Membre averti
    Homme Profil pro
    Responsable Maintenance
    Inscrit en
    Août 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Responsable Maintenance

    Informations forums :
    Inscription : Août 2012
    Messages : 478
    Points : 442
    Points
    442
    Par défaut
    Pour rapporter les donnée du port com j'utilise System.IO.Ports.SerialPort
    et je fais un Readline pour stocker la chaine émise sur le port com.
    A chaque fois que j'utilise le pointeur d’épaisseur il envoi une chaine et je l'attrape par un readline.
    Cependant je veux couper la boucle par un bouton mais je n'y pas accès vu que je suis coincer dans une boucle ( qui lit et attends le prochain readline d'ou l'idée du multithread... avant que je sache la limitation de transfert de donnée vers le thread principal)
    Comment peut on faire pour créer une pause pour que j’accède sur quelques secondes sur le bouton.
    cdt

  7. #7
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    OK, je comprends mieux ...
    Je n'ai pas la possibilité d'utiliser le port série, mais je peux utiliser ReadLine sur un fichier TXT.
    Avec le code suivant, j'ai le même problème que toi : Impossible d'arrêter la boucle, ne serait-ce qu'un instant.
    Je vais travailler un peu là-dessus et pour cela, je voudrais savoir si tes données viennent par lots d'une longueur maximale (laquelle) ? Je souhaite savoir si je peux définir un buffer de lecture de taille fixe maximale suffisante.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            Dim FichierEntree As New StreamReader("D:\Tmp\MonFichier.TXT")
            Dim Ligne As String
            Do Until FichierEntree.Peek = -1        ' Peek donne le prochain octet.  Quand cet octet vaut -1, il signifie EOF
                Ligne = FichierEntree.ReadLine()
                LBMesDonnees.Items.Add(Ligne)
            Loop
            FichierEntree.Close()

  8. #8
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    J'ai la solution

    Telle que réglée dans le code ci-après, ma solution consomme 1 seconde toutes les 1000 lignes lues avec ReadLine. J'accorde en effet 1 milliseconde entre chaque ReadLine pour prendre en compte le clic du bouton "Pause". Pour des lots que quelques centaines d'enregistrements, cela ne devrait pas poser de problème.
    Au besoin, il est possible de lire par lots de 10 ReadLine, auquel cas le temps perdu ne serait plus que de 0.1 sec par 1000 lignes, et on peut faire encore mieux !
    Mon code n'est pas documenté, n'hésite pas reposter des extraits si je dois les expliquer.
    Mes tests sont effectués sur un fichier TXT créé avec Notepad à l'aide de quelques dizaines de copie du code de ce programme. Ce fichier TXT est désigné à la 1ère ligne de code du programme, tu dois bien entendu désigner là, ta source de donnée.

    Voici le code complet et ensuite, l'illustration de l'interface (de sorte que puisse recréer exactement la même chose).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    Imports System.IO
     
    Public Class FBase
     
        Dim NomFichierEntree As String = "D:\Tmp\MonFichier.TXT"
        Dim FichierEntree As StreamReader
        Dim OnContinue As Boolean = True
        Dim WithEvents MonTimer As New Timer
     
        Sub LitFichier()
            Dim Ligne As String
            Ligne = String.Empty
            If Not FichierEntree.Peek = -1 Then ' Peek donne le prochain octet.  Quand cet octet vaut -1, il signifie EOF
                Ligne = FichierEntree.ReadLine()
            End If
            LBDonnees.Items.Add(Ligne)
            BPause.Select()                     ' Donne le tmeps d'une pause, qui ne dure que 0.001 seconde quant Timer.Interval = 1
        End Sub
     
        Private Sub BDepart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BDepart.Click
            FichierEntree = OuvrirFichier(NomFichierEntree)
            MonTimer.Interval = 1
            MonTimer.Start()
        End Sub
     
        Private Sub BPause_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BPause.Click
            OnContinue = Not OnContinue
        End Sub
     
        Private Sub BStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BStop.Click
            OnContinue = False
            MonTimer.Stop()
            FermerFichier(FichierEntree)
        End Sub
     
        Private Sub MonTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles MonTimer.Tick
            If OnContinue Then
                LitFichier()
            End If
        End Sub
     
        Private Function OuvrirFichier(ByRef NomFichier As String) As StreamReader
            Return New StreamReader(NomFichier)
        End Function
     
        Private Sub FermerFichier(ByRef Fichier As StreamReader)
            Fichier.Close()
        End Sub
     
    End Class
    Nom : Interface.jpg
Affichages : 224
Taille : 44,6 Ko

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Utiliser un timer pour faire de l'asynchronisme, c'est pas terrible. Il existe plein de possibiités pour faire ça. Entre autres, utiliser une Task et d'utiliser la méthode Invoke de la ListBox. Donc pour reprendre ton exemple de lecture de fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
        Private stopTraitement As Boolean
        Private Sub Traitement()
            stopTraitement = False
            Task.Factory.StartNew(Sub()
                                      ReadFile()
                                  End Sub)
        End Sub
        Private Sub ReadFile()
            Using FichierEntree As New StreamReader("D:\Temp\MonFichier.txt")
                Dim Ligne As String
                Do Until ((FichierEntree.Peek = -1) Or stopTraitement)
                    ' Peek donne le prochain octet.  Quand cet octet vaut -1, il signifie EOF
                    Ligne = FichierEntree.ReadLine()
                    LBMesDonnees.Invoke(Sub() LBMesDonnees.Items.Add(Ligne))
                Loop
            End Using
        End Sub
    J'ai fait au plus rapide car pour bien faire il faudrait tester InvokeRequired. Et là, rien n'empêche d'ajouter des boutons et de déplacer la fenêtre.

  10. #10
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Sur que le coup du Timer, c'est pas le plus fameux mais c'est simple et ça peut sûrement suffire à de nombreux cas.
    J'ai fait comme toi : au plus simple.
    Merci pour ta solution, mais je ne vois pas comment tu vas provoquer une pause et une reprise du processus de lecture ..., je vais tester .

Discussions similaires

  1. Reception d'une trame avec port com (threads ?)
    Par vinowan dans le forum VB.NET
    Réponses: 11
    Dernier message: 13/10/2011, 11h26
  2. [socket] envoyer des données vers un port com
    Par Slimer dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 20/07/2004, 17h35
  3. [debutant][Port COM]
    Par Shooter dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 06/07/2004, 09h43
  4. [javaComm]Communication port COM
    Par gui4593 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 04/06/2004, 12h35
  5. port com
    Par jeremi dans le forum C
    Réponses: 12
    Dernier message: 16/09/2002, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo