Multithreading

  • VB.NET

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

    Multithreading

    Hallo liebe Community,
    Ich würde gerne bei meinem TabControl die Animation in einem Neuen Thread laufen lassen,
    doch wie mache ich dies am besten?
    Sub:

    VB.NET-Quellcode

    1. Sub AnimationLeftScroll(ByVal Control1 As Control, Control2 As Control)


    Und wie Rufe ich dies nun auf?
    Normalerweise passiert das aufrufen ohne multihreading hier:

    VB.NET-Quellcode

    1. Protected Overrides Sub OnSelecting(e As System.Windows.Forms.TabControlCancelEventArgs)
    2. If LastIndex < e.TabPageIndex Then
    3. AnimationRightScroll(TabPages(LastIndex), TabPages(e.TabPageIndex))
    4. Else
    5. AnimationLeftScroll(TabPages(LastIndex), TabPages(e.TabPageIndex))
    6. End If
    7. End Sub


    Doch wie genau kann ich jetzt diese Animation in einem neuen Thread laufen lassen?
    Bitte um Hilfe, und Erklärung.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    So habe ich das schon Probiert:

    VB.NET-Quellcode

    1. Protected Overrides Sub OnSelecting(e As System.Windows.Forms.TabControlCancelEventArgs)
    2. Dim neuerthread As System.Threading.Thread
    3. neuerthread = New System.Threading.Thread(AddressOf Me.AnimationRightScroll(TabPages(LastIndex), TabPages(e.TabPageIndex)))
    4. neuerthread.Start() 'Vorgang starten
    5. If LastIndex < e.TabPageIndex Then
    6. AnimationRightScroll(TabPages(LastIndex), TabPages(e.TabPageIndex))
    7. Else
    8. AnimationLeftScroll(TabPages(LastIndex), TabPages(e.TabPageIndex))
    9. End If
    10. End Sub

    Fehlermeldung:
    Fehler 1 Der AddressOf-Operand muss dem Namen einer Methode entsprechen (ohne Klammern).
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    VB.NET-Quellcode

    1. New System.Threading.Thread(Sub() If(LastIndex < e.TabPageIndex, AnimationRightScroll(TabPages(LastIndex), TabPages(e.TabPageIndex)) , AnimationLeftScroll(TabPages(LastIndex), TabPages(e.TabPageIndex))))
    Moderatorin: "Apropo ritzen.." Shin Chan: "hoho sie hat Po ritze gesagt"
    "saying to buy a mac because your anti-virus expired is like saying you're out of condoms so you're just going to go fuck dudes"
    "Wie auch in anderen Threads kann ich leider nichts bieten außer vielleicht spaß beim Skypen aber mehr leider auch nicht." - Sind kinder pornos nicht verboten?
    Darf ich mitmachen, bei eure Besserwissereien? (ich weisses nämlich noch besser ;)):

    Es geht nämlich gar nicht. eine Control-Animation kann man nicht in einen NebenThread verlegen, weil man aus einem Nebenthread nicht aufs Control zugreifen kann.

    Punktum. Thema abgehandelt.
    Der Erfinder des Rades hat recht. Wenn du einen Invoke durchführst, dann machst du das, um vom Nicht-UI-Thread wieder in den UI-Thread zu gelangen und anschließend von dort aus den für die Animation nötigen Code auszuführen (denn nur vom UI-Thread aus ist das überhaupt nur möglich). Folglich führt das Verwenden eines 2. Threads nur zu unnötigen Invokes und damit zu einer schlechteren Performance.
    Um eine Animation in einer WindowsForms-Anwendung zu erzeugen, würde ich einen Timer verwenden. Das Interval muss auch nicht so gering gewählt werden. 40 ms müssten zu einer flüssigen Animation mit 25 fps führen (theoretisch, ich habs jetzt nicht getestet).

    Ich nehme an, du hast bei deinem TabControl eine While-Schleife verwendet. Die führt natürlich dazu, dass das Fenster während der gesamten Animationsdauer nicht reagiert. Aber es ist nicht wirklich schlimm, weil die Animation nur sehr kurz ist (man merkt es eigentlich nur bei Geschwindigkeit 1).

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Infinity“ ()