Ungültiger threadübergreifender Vorgang

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Ungültiger threadübergreifender Vorgang

    Hallihallo,

    ich teste gerade mein Projekt und da kam es zu folgendem Fehler in Zeile 4:

    System.InvalidOperationException: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement lstPlaylist erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    Die Funktion wird aufgerufen, wenn mein Musiktitel zu Ende ist (ich benutze die bass.dll).

    Der Code der Methode sieht so aus:

    VB.NET-Quellcode

    1. Private Sub OnTrackEnd(syncHandle As Integer, channel As Integer, data As Integer, user As IntPtr)
    2. If Wiederholen = "Nein" Then
    3. If lstPlaylist.SelectedIndex = lstPlaylist.Items.Count - 1 Then
    4. Else
    5. NächsterTrack()
    6. End If
    7. ElseIf Wiederholen = "Alles" Then
    8. If lstPlaylist.SelectedIndex = lstPlaylist.Items.Count - 1 Then
    9. lstPlaylist.SelectedIndex = 0
    10. Else
    11. lstPlaylist.SelectedIndex = lstPlaylist.SelectedIndex + 1
    12. End If
    13. End If
    14. 'Await Threading.Tasks.Task.Delay(1)
    15. Abspielen()
    16. End Sub


    Aufgerufen wird sie folgendermassen:

    VB.NET-Quellcode

    1. SyncTrackEnd = New SYNCPROC(AddressOf OnTrackEnd)
    2. Bass.BASS_ChannelSetSync(chan, BASSSync.BASS_SYNC_END, 0, SyncTrackEnd, IntPtr.Zero)


    Von Threads verstehe ich bisher recht wenig (ausser dass ich weiss, was das ist), weiss jemand, wie man das Problem beheben kann?

    kafffee schrieb:

    Und wonach soll ich da suchen?
    Invoke diese Zeile in den GUI-Thread, hatten wir bereits.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Invoke > ist klar
    GUI > auch klar

    Aber was ist der GUI Thread und wo finde ich den?

    Sicher dass wir das schon hatten?

    Edit: ach so du meinst du Frage hat schon jemand anders gestellt, ich werd mir das mal durchlesen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kafffee“ ()

    @kafffee Der Gui-Thread ist der von Me in einer Form.
    Das läuft auf so was hinaus:

    VB.NET-Quellcode

    1. Me.Invoke(Sub() Label1.Text = "bla")
    Ich empfehle Dir, die komplette Prozedur im Main-Thread ablaufen zu lassen:

    VB.NET-Quellcode

    1. Private Sub OnTrackEnd(syncHandle As Integer, channel As Integer, data As Integer, user As IntPtr)
    2. Me.Invoke(Sub() Me.TrackEnd())
    3. End Sub
    4. Private Sub TrackEnd()
    5. If Wiederholen = "Nein" Then
    6. If lstPlaylist.SelectedIndex = lstPlaylist.Items.Count - 1 Then
    7. Else
    8. NächsterTrack()
    9. End If
    10. ElseIf Wiederholen = "Alles" Then
    11. If lstPlaylist.SelectedIndex = lstPlaylist.Items.Count - 1 Then
    12. lstPlaylist.SelectedIndex = 0
    13. Else
    14. lstPlaylist.SelectedIndex = lstPlaylist.SelectedIndex + 1
    15. End If
    16. End If
    17. 'Await Threading.Tasks.Task.Delay(1)
    18. Abspielen()
    19. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Gibt's eine Möglichkeit, bei der Veränderung einer Variablen ein Event auszulösen?

    Weil dann könnte ich den Index meiner Listbox bei jeder Änderung in eine Variable speichern und umgekehrt..

    Das wär glaube ich die einfachste Methode...

    Edit:
    OK unsere Posts haben sich gerade überschnitten. Deine Methode wär natürlich noch einfacher ich probier das mal aus...

    kafffee schrieb:

    Gibt's eine Möglichkeit, bei der Veränderung einer Variablen ein Event auszulösen?
    Ja.
    Mach aus der Variable eine Property und in deren Setter vergleichst Du den bisherigen und den neuen Wert, und bei Änderung tust Du, was zu tun ist:

    VB.NET-Quellcode

    1. Private _MyValue As Integer
    2. Public Property MyValue As Integer
    3. Get
    4. Return _MyValue
    5. End Get
    6. Set(value As Integer)
    7. If _MyValue = value Then
    8. Return
    9. End If
    10. _MyValue = value
    11. DoWhatEver()
    12. End Set
    13. End Property
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich empfehle nochmal, sich das Zeug, was bass.dll bereitstellt auch anzugucken. Ausschau halten nach Membernamen, die 'Sync' oder 'Async' enthalten. das wird doch einen Grund haben, warum dieses Objekt 'SyncProc' heisst.

    Immer das bevorzugen, wasses schon gibt. Bleiben noch genügend unerfundene Räder zum selber erfinden übrig.

    Du kannst auch einen Screenshot posten, von wie dein OB das SyncProc-Dingens anzeigt.
    Wenn man im OB Schwierigkeiten hat was zu finden liegts gelegentlich auch an einer ungünstigen Einstellung.
    Aber dazu habich ja Tuts gemacht, und dort herum-verlinkt, wo gezeigt ist, wie man den OB sinnig einrichtet.
    VisualStudio richtig nutzen (Google ist nicht deine Mami)
    (ansonsten kann man auch mal bischen rumprobieren)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    warum dieses Objekt 'SyncProc' heisst.


    Nein das scheint nicht der Grund.
    http://bass.radio42.com/help/html/b3003de9-624a-e621-6b9c-2304b4dfe02c.htm

    User defined synchronizer callback function


    Man kann Parameter beim erzeugen eines Audiostreams festlegen. Z.b. beim ende eines Liedes wird die void einmal gecallt. Man kann auch alle X Millisekunden angeben, um zum Beispiel den Audiostream zu Visualisieren, kopieren oder in einem weiteren Stream mixen(z.B. für Upmixes, Stereo zu 7.1) und vieles mehr.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Takafusa“ ()