In den Hauptthread zurückkehren

  • VB.NET
  • .NET (FX) 4.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    In den Hauptthread zurückkehren

    Hallo,

    ich bin doch soweit, dass ich alle Datasetmanipulationen im Hauptthread durchführen möchte. Ich habe in meinem Programm mehrere Schichten: GUI->Daten->Register->Kommunikation RS485. Kommunikation läuft im Nebenthread, die empfangenen Daten müssen unmittelbar nach Aufbereitung in der GUI angezeigt werden. Zur Zeit ist es so, dass bei der Kommunikation nach Ausführung eine Callback-Methode aufgerufen wird, in dieser werden die Daten teilweise schon direkt ins Dataset eingetragen, dann wird ein Event ausgelöst, welches die Daten in die Datenschicht trägt, da werden sie noch weiterverarbeitet, dann Event in die GUI, da endgültig weiterverarbeitet und die Bindings aktualisiert.
    Da die Anwendung immer wieder mal abstürzt, sehe ich mich gezwungen, alles in den Hauptthread zu verlagern, was mit Dataset zu tun hat. Erst dachte ich, ich muss die Daten, die ich sonst in der Register-Schicht direkt reingeschrieben habe (in der Callback-Methode), sammeln, in die GUI über Datenschicht schicken, und da alle eintragen.
    Jetzt ist mir aber eine Idee gekommen: ich könnte 2 Callback-Methoden einführen: die erste bringt alle Rohdaten direkt in die GUI und von da wird die zweite Callback-Methode aufgerufen, über Invoke, die dann die Daten im Hauptthread einträgt. Die zweite Methode wäre die, die ich jetzt als erste habe, d.h. ich müsste überhaupt keinen Code anpassen.

    Da es zu schön klingt, um wahr zu sein (paar Zeilen Code nur hinzufügen), wollte ich nachfragen, ob ich irgendwo einen Denkfehler habe...

    Und btw.: dann bräuchte ich keine ResetBindings() mehr machen, wenn die Daten im Hauptthread eingetragen werden, oder?
    Wie kriege ich das syntaktisch hin, AddressOf CallbackGUI an die Register-Schicht zu übergeben (bei New)?

    Wie ich es probiert habe, geht es nicht:

    VB.NET-Quellcode

    1. Private _callbackGUI As Action(Of Transaction)
    2. Public Sub New(ByVal callbackGUI As Action(Of Transaction)) ', ByVal man As ManufacturerDataTable)
    3. _callbackGUI = callbackGUI
    4. End Sub
    5. Private Sub GetReadTransactions()
    6. RecRegTr = New Transaction(MB_COMMAND.READ_REGISTERS, mbDev.slaveID, rec_reg_addr, reg_length, Data, AddressOf _callbackGUI, AddressOf RecRegResult)
    7. 'Compilerfehler "AddressOf-Operand muss einem Methodennamen entsprechen"
    8. End Sub


    EDIT: war einfacher, als ich dachte. Statt AddressOf _callbackGUI nur _callbackGUI schreiben, weil es schon ein Pointer ist...
    ResetBindings() musste ich übrigens wieder reinnehmen, sonst hat sich ComboBox im DGV nicht aktualisiert. Ich muss schauen, ob es nicht reicht, wenn ich nur die BS vom DGV resette. Aber jetzt erst mal Urlaub, nach Ostern geht es weiter :)