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 :

procédure 'handle' modifiant un Form : impossible?


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Points : 11
    Points
    11
    Par défaut procédure 'handle' modifiant un Form : impossible?
    Bonjour,
    J'ai un projet VB2005 express comprenant un Form et une classe.
    La classe 'DeviceWithSerial' contient un membre de type system.io.serial.port

    Quand des données sont recues sur ce port série, une procedure 'handle' est appelée.
    1/ Dans cette procédure je voudrais simplement recuperer les données dans le tampon du port série et les afficher dans un Textbox du Form.
    Cela ne fonctionne pas ( champ texte vide )
    2/ J'ai tenté d'écrire les données dans une variable Public String 'pos2' au niveau Form, cela ne fonctionne pas non plus ( chaine vide )
    3/ Le seul moyen que j'ai trouvé est de stocker les données dans une variable de la classe 'pos1', et à partir d'un timer du Form recuperer le contenu de 'pos1' pour l'afficher dans le textbox.

    Pourquoi les solutions 1/ et 2/ ne fonctionnent pas ? Est ce que çà a un rapport avec cette histoire de Form non 'threadsafe' ?

    Voici le code:-------------------------------------------------------

    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
    Public Class Form1
        Dim Dev1 As New DeviceWithSerial
        Public Pos2 As String
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Call Dev1.InitialiserCommunication("COM3")
        End Sub
     
        Private Sub TimerRefresh_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerRefresh.Tick
            Me.TextBox1.Text = Dev1.Pos1
        End Sub
    End Class
     
     
    Public Class DeviceWithSerial
        Private WithEvents Sp As New System.IO.Ports.SerialPort
        Public Pos1 As String
     
        Public Sub InitialiserCommunication(ByVal NomPort As String)
            Sp.PortName = NomPort
            Sp.BaudRate = "9600"
            Sp.Parity = IO.Ports.Parity.None
            Sp.StopBits = IO.Ports.StopBits.One
            Sp.DataBits = 8
            Sp.ReceivedBytesThreshold = 10
            Call Sp.Open()
        End Sub
     
        Sub Reception(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Sp.DataReceived
            Dim bufferin() As Char = New Char(10) {}
            Sp.Read(bufferin, 0, Sp.ReceivedBytesThreshold)
            Pos1 = bufferin
            Form1.Pos2 = bufferin
            Form1.TextBox2.Text = bufferin
        End Sub
     
    End Class
    ---------------------------------------------------------------------

    Merci pour toute aide...

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    le serial port appelle ton handles sur un autre thread que le thread principal
    seul le thread principal a le droit de manipuler les controles
    c'est pourquoi ton timer fonctionne, l'event tick est toujours sur le thread principal, alors que plusieurs classes peuvent appeller sur d'autres threads (celles de com série ou réseau etc...)

    il y a néanmoins une solution plus propre que le timer, les délégués
    fait une recherche sur ce forum, j'ai dejà expliqué le fonctionnement des délégués



    sinon une classe threadsafe est une classe dont on peut appeler n'importe quel membre depuis n'importe quel thread sans que ca bug
    le multi threading est quelque chose de bien mais de risqué
    par exemple, si un thread parcours une collection et qu'un autre ajoute un item à cette collection pendant que l'autre tourne, ca plante ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Merci pour la réponse.
    J'ai essayé d'appliquer ce que tu as écrit sur les 'delegués' :

    http://www.developpez.net/forums/d49...es-difference/

    http://www.developpez.net/forums/sho...21&postcount=9

    et j'ai donc modifié mon code comme suit:

    -----------------------------------------------------------

    Public Class Form1

    Dim Dev1 As New DeviceWithSerial

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Call Dev1.InitialiserCommunication("COM3")
    End Sub

    Private Delegate Sub typeDelegate(ByVal pos As String)

    Private DelegateModifierInterface As New typeDelegate(AddressOf ModifierInterface)

    Public Sub ModifierInterface(ByVal pos As String)
    If Me.InvokeRequired Then
    Me.Invoke(DelegateModifierInterface)
    End If
    Me.TextBox1.Text = pos
    End Sub

    End Class

    Public Class DeviceWithSerial
    Private WithEvents Sp As New System.IO.Ports.SerialPort


    Public Sub InitialiserCommunication(ByVal NomPort As String)
    Sp.PortName = NomPort
    Sp.BaudRate = "9600"
    Sp.Parity = IO.Ports.Parity.None
    Sp.StopBits = IO.Ports.StopBits.One
    Sp.DataBits = 8
    Sp.ReceivedBytesThreshold = 10
    Call Sp.Open()
    End Sub

    Sub Reception(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Sp.DataReceived
    Dim bufferin() As Char = New Char(10) {}
    Sp.Read(bufferin, 0, Sp.ReceivedBytesThreshold)
    Call Form1.ModifierInterface(bufferin)
    End Sub

    End Class

    ---------------------------------------------------------

    Maintenant en debug
    quand 'Reception' appelle 'ModifierInterface'
    au passage dans 'ModifierInterface' , 'Me.InvokeRequired' est à false !
    donc ça ne change rien , je n'utilise pas le délégué et passe directement à
    'Me.TextBox1.Text = pos'
    Avec un point d'arret apres cette ligne je trouve que
    'Me.TextBox1.Text' et 'pos' contiennent tous deux la chaine attendue=tampon du port série.
    Mais au final sur l'interface le TextBox est toujours vide ! et je n'obtiens pas de message d'erreur !

    ???

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    il manque le exit sub après le me.invoke
    mais ca ne résoudra pas ton problème étrange par contre ...
    si une idée me vient je te dirais mais là je vois pas trop
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [C#] Modifier mes Forms a partir de Class
    Par folk dans le forum Windows Forms
    Réponses: 12
    Dernier message: 01/08/2006, 17h54
  2. Modifier la forme des boutons
    Par issou dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 30/04/2006, 20h35
  3. Appeler une procédure d'un sou form
    Par marie10 dans le forum Access
    Réponses: 10
    Dernier message: 28/02/2006, 10h19
  4. Réponses: 3
    Dernier message: 22/11/2005, 20h42
  5. Réponses: 4
    Dernier message: 04/10/2005, 00h07

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