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 :

timer dans serialport


Sujet :

VB.NET

  1. #21
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Bonjour,

    merci beaucoup Mabrouki pour ces informations. Tout d'un coup, je comprends mieux les déclenchements "aléatoires" du timer.

    Effectivement, je n'avais pas pensé que VB pouvait avoir une "notice", ce qui semble pourtant évident.

    Il y a une petite chose que je ne comprends/sais pas concernant la précision du timer: les timers sont précis au 1/18ème de seconde n'est-ce pas? Pour des applications qui ne nécessitent pas une précision supérieure (disons de l'ordre du 1/10ème de seconde), est-il nécessaire de se reporter à l'horloge plutôt qu'à une mesure en interne. Et si cela est le cas, savez-vous comment faire l'équivalent d'un "tick" du timer après le dépassement d'un intervalle donné?

    Merci

  2. #22
    Membre éprouvé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    1 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 627
    Par défaut
    System.Windows.Forms.Timer dépend du thread UI pour se déclencher, si le thread UI est occupé à dessiner, ça bloque le déclenchement. Ce timer est utile pour des éléments d'affichage.

    Or toi tu fais un traitment interne, d'où l'intérêt d'utiliser System.Timers.Timer, qui est fait pour ça. La précision de ce Timer est de la milliseconde.


    Ton code devenir quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim monTimer as System.Timers.Timer = New System.Timers.Timer()
    dans l'idée

  3. #23
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut thread serialport_received,thread timer sur ui
    Bonsoir pierregr
    Comme dit par Arnard au tout debut du post et apres analyse du probleme,il s'avere que l'evenement SerialPort1_DataReceived est geree sur un thread separe du thread principal .

    Comme le timer est un timer WinForm sur le thread thread principal on ne peut pas le demarrer ou stopper,acceder a ses proprietes ou evenement dans le thread de SerialPort1_DataReceived .

    Aussi faut-il passer par Form.BeginInvoke qui n'attends pas (Form.Invoke est bloquant car il attend la mise à jour UI) un Delegate, et 2 methodes simples - timerStartDlgMethod & timerStopDlgMethod demarre par le Delegate .
    J'ai fait la simultion sur l' outil Emulateur VSPE de port serie de Eterlogic.
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    Public Class frmReceiveData
        Private Codebarres As String = ""
        Private tempsdepart As Long
        Private tempsfin As Long
        Private interval As Integer = 100
        Private coeffpdv As Integer = 1
        Private counter As Integer = 0
        Public Delegate Sub timerDelegate(ByVal StartSop As Boolean)
     
        Private Sub SerialPort5_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            If SerialPort1.BytesToRead >= 20 Then
                Codebarres = SerialPort1.ReadExisting()
                'appel via delegate à stopper timer
                Call timerStopDlgMethod()
                If counter > 1 Then
                    'appel via delegate à demarrer timer
                    '
                    tempsdepart = Now.Ticks
                    Call timerStartDlgMethod()
                End If
                tempsfin = Now.Ticks
            End If
     
        End Sub
        'Methode Delegate stoppe timer6
        Public Sub timerStopDlgMethod()
            ' Make sure we're on the UI thread
            If Me.InvokeRequired = False Then ' => on est sur thread principal
                Me.Timer6.Stop()
                Me.txtStopTimer.Text = Me.txtStopTimer.Text & "stoppe  timer6 : " & counter.ToString & vbCrLf
            Else ' => on n'est pas  sur thread principal => le delegate est necessaire
                ' Stoppe timer6
                Me.BeginInvoke(New timerDelegate(AddressOf timerStopDlgMethod), New Object() {Nothing})
            End If
        End Sub
        'Methode Delegate demarre timer6
        Public Sub timerStartDlgMethod()
            ' Make sure we're on the UI thread
            If Me.InvokeRequired = False Then ' => on est sur thread principal
                'interval = tempspochette(tempsdepart, tempsfin)
                'Timer6.Interval = interval * coeffpdv Me.Timer6.Start()
                Me.txtStartTimer.Text = Me.txtStartTimer.Text & "demarre  timer6 : " & counter.ToString & vbCrLf
                Me.txtStartTimer.Text = Me.txtStartTimer.Text & Codebarres & vbCrLf
            Else ' => on n'est pas  sur thread principal => le delegate est necessaire
                ' Demarre timer6
                Me.BeginInvoke(New timerDelegate(AddressOf timerStartDlgMethod), New Object() {Nothing})
            End If
        End Sub
    le lien eterlogic si tu es interresse par l'emulateur VPS
    http://www.eterlogic.com/

    Assez simple d'emploi :
    -tu crees 2 ports series virtuels dans menu "creer peripherique->connector" ensuite dans le menu tu fais "creer peripherique->serial redirector" pour connecter les 2 connector" 2 ports series virtuels .
    Tu ouvres les 2 ports ensuite l'un comme entrant et l'autre comme sortant.
    bon code...

  4. #24
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 109
    Par défaut
    Bonjour,

    merci à vous, particulièrement à Mabrouki qui m'a carrément refait le code, c'est génial. J'ai juste fait une petite modification. J'aimerais vérifier si elle est correcte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Public Sub timerStartDlgMethod()
            ' Make sure we're on the UI thread
            If Me.InvokeRequired = False Then ' => on est sur thread principal
                'interval = tempspochette(tempsdepart, tempsfin)
                'Timer6.Interval = interval * coeffpdv
                Me.Timer6.Start()
                ' Me.txtStartTimer.Text = Me.txtStartTimer.Text & "demarre  timer6 : " & counter.ToString & vbCrLf
                ' Me.txtStartTimer.Text = Me.txtStartTimer.Text & Codebarres & vbCrLf
            Else ' => on n'est pas  sur thread principal => le delegate est necessaire
                ' Demarre timer6
                Me.BeginInvoke(New timerDelegate(AddressOf timerStartDlgMethod), New Object() {Nothing})
            End If
    Par contre, étant encore débutant, je n'y connais pas grand chose dans les threads. Si j'ai bien compris ce que j'ai trouvé, le thread est une "unité d'exécution de programme". Si on veut faire communiquer 2 threads, il faut passer par la méthode Invoke qui permet d'"appeler" un thread dans un autre.
    Par contre, comment sait-on qu'une partie du programme s'exécute dans un thread et une autre dans un second thread?

    Merci

Discussions similaires

  1. Creer un composant non visuel(Timer) dans une DLL
    Par hugobob dans le forum Composants VCL
    Réponses: 1
    Dernier message: 06/06/2006, 16h20
  2. Création du timer dans une Dll
    Par Hokagge dans le forum MFC
    Réponses: 13
    Dernier message: 14/03/2006, 18h04
  3. Réponses: 4
    Dernier message: 08/07/2005, 17h37
  4. Utiliser un timer dans une application console
    Par chavers dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2005, 14h07
  5. Timer dans une feuille excel
    Par bbkenny dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 28/01/2005, 10h43

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