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:
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...