Hallo Forum,
die Betreffzeile mag auf ein einfaches Problemchen hinweisen, ich warne aber schonmal vor: das wird nicht trivial... leider . Und auch nicht kurz
Sollte mein Versuch, das Problem erfolgreich zu schildern, fehlschlagen, lasst mich das bitte wissen, ich bin gerne bereit, alles ausführlichst zu schildern
Aber eins nach dem anderen.
Was macht meine Anwendung denn allgemein?
Meine VB.Net-Applikation soll drei Komponenten miteinander vernetzen: eine Datenbank, einen TCP-Listener und eine Baugruppe, die über einen CAN-Bus angesprochen wird (ein CAN-to-USB Converter macht den Anschluss an den PC möglich).
Wo tritt das Problem auf?
Damit die 3 Komponenten untereinander Daten austauschen können und die Windows-Form nicht einfriert, habe ich mich dazu entschlossen, den Datenaustausch über Threads und Events zu realisieren (das funktioniert auch prima).
Wer schonmal mit Threads gearbeitet hat, weiß, dass man sowas wie Invoke-Funktionen benötigt, um mit den Daten aus den Threads auch arbeiten zu können. Und in einer dieser Invoke-Funktionen scheint sich bei mir ein Fehler eingeschlichen zu haben (nehme ich zumindest an...).
Wie äußert sich das Problem?
Ich will zunächst diese Invoke-Funktion mal posten:
Private Sub kw_AdapterInfo(ByVal InfoData As List(Of String)) Handles _
kabelwagen.AdapterInfoAvailable
'Variablen
Dim callback As kwAdpaterInfo_Callback
Dim test As Object
test = InfoData
If (Me.InvokeRequired = True) Then
callback = New kwAdpaterInfo_Callback(AddressOf kw_AdapterInfo)
Me.Invoke(callback, test)
Else
'--------------------------------------------
' Neuen Wert mit altem vergleichen
'--------------------------------------------
'Der alte Wert ist global gespeichert
CompareFoundAdapters(InfoData)
End If
End Sub Derjenige, der mit Threads schon was zu schaffen hatte, kennt den Ablauf. Für andere, die das interessiert: fragt nach, ich erklärs gerne.
Aber wo ist denn jetzt der Fehler?
Der Fehler kommt offenbar erst in der Funktion CompareFoundAdapters(InfoData) zum Tragen (diese Funktion wird beim zweiten Aufruf erst ausgeführt). In dieser Funktion habe ich jetzt das Problem, dass ich den alten und den neuen Wert nicht miteinander vergleichen kann. Damit ich das besser beschreiben kann, poste ich jetzt mal ein Teil dieser Funktion:
Private Sub CompareFoundAdapters(ByVal newValueList As List(Of String))
'Variablen
Dim count As Integer
Dim newAdapter, serial As String
Dim tempList, StatusUnterwegs, StatusFrei, newCable As New List(Of _
String)
'--------------------------------------------
' Listen vergleichen
'--------------------------------------------
'alte Liste
For Each element In FoundAdaptersList
'neue Liste
newAdapter = newValueList(count)
If element Like newAdapter Then
'Alles OK, nächstes element
Else
'I.was ist anders
End If
count += 1
Next element
'--------------------------------------------
' Alte Liste überschreiben
'--------------------------------------------
FoundAdaptersList = newValueList Was ich tun möchte ist, den alten Wert FoundAdaptersList mit dem neuen Wert ByVal newValueList As List(Of String) zu vergleichen. Beide Werte sind übrigens Listen! Das heißt ich gehe alle Elemente beider Listen peu a peu durch, vergleiche sie und tu dann was. Am Schluss überschreibe ich den alten Wert mit dem neuen.
Das Problem ist immernoch nicht klar nehme ich an. Das kommt auch jetzt:
Ändern sich die Inhalte des neuen Werts, ändert sich AUTOMATISCH auch SOFORT der alte Wert. Aber nicht erst, nachdem ich FoundAdaptersList = newValueList ausgeführt habe, nein, die Werte sind schon gleich ehe die Funktion CompareFoundAdapters(InfoData) überhaupt in der Invoke-Funktion aufgerufen wurde!
Das klingt jetzt sicher abentuerlich, aber das ist genau so! Ich renn hier schon seit Stunden im Kreis uns hüpf im Dreieck aber ich bekomm den Fehler ums verrecken nicht raus.
Für eure Hilfe bin ich sehr dankbar!!!!
Lg |