Hallo,
ich bin mir nicht sicher, ob die Überschrift 100%ig passend ist, aber derzeit fällt mir nichts besseres ein.
Worum gehts:
ich schreibe derzeit an einem Programm mit GUI + verschiedenen Klassenbibliotheken in unterschiedlichen Namespaces, teilweise VB, teilweise C#.
Eine der Klassenbibliotheken kommuniziert über eine serielle Schnittstelle und fragt Timer-gesteuert ab, ob neue Daten am COM-Port anliegen.
Wenn ja (und vollständig), dann werden die ausgewertet und es werden entsprechende Ereignisse abgefeuert. Hier ein wenig Code:
Spoiler anzeigen
Derzeit ist es so, dass in der GUI mit
Spoiler anzeigen
Falls ich mich nicht vertippt habe, dann sollte das so in etwa auch funktioniere, ich habe hier nicht den vollständigen Original-Quellcode gepostet sondern nur einen Zusammenschnitt...
Jetzt handelt es sich aber in Realität nicht nur um 1 Event, sondern um deutlich mehr, und ich möchte daher die komplette Geschichte mit den Delegaten usw. direkt in die SerialComm-Klasse verschieben.
Dies ist so in etwa mein Versuch, aber klappt nicht:
Spoiler anzeigen
irgendwelche Ideen, was ich hier falsch mache???
Danke,
Christoph
ich bin mir nicht sicher, ob die Überschrift 100%ig passend ist, aber derzeit fällt mir nichts besseres ein.
Worum gehts:
ich schreibe derzeit an einem Programm mit GUI + verschiedenen Klassenbibliotheken in unterschiedlichen Namespaces, teilweise VB, teilweise C#.
Eine der Klassenbibliotheken kommuniziert über eine serielle Schnittstelle und fragt Timer-gesteuert ab, ob neue Daten am COM-Port anliegen.
Wenn ja (und vollständig), dann werden die ausgewertet und es werden entsprechende Ereignisse abgefeuert. Hier ein wenig Code:
VB.NET-Quellcode
- Public Class SerialComm()
- Private readtimer As System.Threading.Timer
- Private invervalValue as Long
- Public Event DataReceived(byref sender as Object, byval data as String)
- Public Sub New(ByVal port As SerialPort, ByVal interval As Long)
- Dim tcb As System.Threading.TimerCallback = AddressOf read
- intervalValue = interval
- readtimer = New System.Threading.Timer(tcb, Nothing, Timeout.Infinite, intervalValue)
- End Sub
- Public Sub Open()
- readtimer.Change(0, intervalValue)
- End Sub
- Public Sub Close()
- readtimer.Change(Threading.Timeout.Infinite, intervalValue)
- End Sub
- Private Sub read(state As Object)
- ' [...] Daten von serieller Schnittstelle lesen...
- Dim data as String = "Daten von serieller Schnittstelle"
- RaiseEvent DataReceived(Me, data)
- End Sub
- End Class
Derzeit ist es so, dass in der GUI mit
Me.InvokeRequired()
kontrolliert wird, ob zur Thread-sicherheit ein Delegat nötig ist oder nicht. Also z.B.:VB.NET-Quellcode
- Public Class MyForm Inherits Form
- Private WithEvents ser As SerialComm
- Public lblOut as Label
- Protected Delegate Sub dSetLabelText(byval text as string)
- Protected Sub RealSetLabelText(byval text as string)
- lblOut.text = data
- End Sub
- Protected Sub SetLabelText(byval text as String)
- If (Me.lblOut.InvokeRequired) Then
- Dim d As New dSetLabelText(AddressOf RealSetLabelText)
- Me.Invoke(d, New Object() {text})
- Else
- Me.RealSetLabelText(text)
- End If
- End Sub
- Protected Sub ser_DataReceived(byref sender as Object, byval data as String) Handles ser.DataReceived
- SetLabeltext(data)
- End Sub
- End Class
Falls ich mich nicht vertippt habe, dann sollte das so in etwa auch funktioniere, ich habe hier nicht den vollständigen Original-Quellcode gepostet sondern nur einen Zusammenschnitt...
Jetzt handelt es sich aber in Realität nicht nur um 1 Event, sondern um deutlich mehr, und ich möchte daher die komplette Geschichte mit den Delegaten usw. direkt in die SerialComm-Klasse verschieben.
Dies ist so in etwa mein Versuch, aber klappt nicht:
VB.NET-Quellcode
- Public Class SerialComm()
- Private readtimer As System.Threading.Timer
- Private invervalValue as Long
- Public Event DataReceived(byref sender as Object, byval data as String)
- Private Delegate Sub dOnDataReceived(byref sender as Object, byval data as String)
- Private Sub realOnDataReceived(byref sender as Object, byval data as String)
- raiseevent DataReceived(me, data)
- End Sub
- Private Sub onDataReceived(byref sender as Object, byval data as String)
- Dim d As New dOnSerialReceived(AddressOf realOnDataReceived)
- d.Invoke(sender, data)
- End Sub
- Public Sub New(ByVal port As SerialPort, ByVal interval As Long)
- Dim tcb As System.Threading.TimerCallback = AddressOf read
- intervalValue = interval
- readtimer = New System.Threading.Timer(tcb, Nothing, Timeout.Infinite, intervalValue)
- End Sub
- Public Sub Open()
- readtimer.Change(0, intervalValue)
- End Sub
- Public Sub Close()
- readtimer.Change(Threading.Timeout.Infinite, intervalValue)
- End Sub
- Private Sub read(state As Object)
- ' [...] Daten von serieller Schnittstelle lesen...
- Dim data as String = "Daten von serieller Schnittstelle"
- RaiseEvent DataReceived(Me, data)
- End Sub
- End Class
irgendwelche Ideen, was ich hier falsch mache???
Danke,
Christoph
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „c.muehlmann“ ()