Multi Threading

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Multi Threading

    Hallo zusammen.
    Ich versuche mich das erste mal an Multi Threading...
    Scheinbar kann ich nicht aus einem zweiten Thread auf andere Controlls zugreifen ?


    VB.NET-Quellcode

    1. Sub Aufruf()
    2. Dim testThread = New Threading.Thread(AddressOf Test)
    3. testThread.Start()
    4. End Sub
    5. Sub Test()
    6. Do
    7. 'irgendwas...
    8. Loop While Form2.AxWindowsMediaPlayer1.playState = 3
    9. End Sub


    kann mir bitte jemand erklären wie ich den Playstate abfragen kann ?

    Vielen Dank !

    Gruss Armin

    kimo schrieb:

    VB.NET-Quellcode

    1. Loop While Form2.AxWindowsMediaPlayer1.playState = 3
    Genau hier greift das Scheiß Mist Ranz blöde versiffte VB6-Kompatibilitäts-Zeugs nicht, da Du Dich in einer falschen Instanz befindest.
    Verstehe dies: Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    und nimm die richtig erzeugte Instanz der 2. Form.
    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!
    Und auch dann kannst du von einem NebenThread nicht auf Controls im UI Tread zugreifen.
    Leider hast du aber auch kein zweites Label angeführt, und anscheinend die forensuche oder google auch leider nicht bemüht.

    z.b. Async, Await und Task

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @kimo Sende aud der Form2 an die Form1 ein entsprechendes Event, da brauchst Du keinen Thread.
    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!
    Sende aud der Form2 an die Form1 ein entsprechendes Event, da brauchst Du keinen Thread

    Der Loop muss auch noch andere Dinge erledigen... Darum brauche ich ihn. Da er aber verhindert, dass ich andere Controlls anklicken kann, wollte ich den Loop in einen anderen Thread "verlegen"

    Armin
    Ne, wenn dann benötigst du einen Timer, keinen Loop.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Nofear23m schrieb:

    Und auch dann kannst du von einem NebenThread nicht auf Controls im UI Tread zugreifen.


    Stimmt nur halb. Ein lesender Zugriff ist sehr wohl möglich. Schreibend natürlich nicht.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    SpaceyX schrieb:

    Ein lesender Zugriff ist sehr wohl möglich. Schreibend natürlich nicht.

    Wo sich mir die frage stellt wofür er eine Schleife durchgehen möchte. sicher um irgendwo einen Play-Button zu de-aktivieren oder in ein Label die aktuelle Zeit hinein zu schreiben.
    Insofern... aber stimmt schon, was schlecht von mir vormuliert (ungenau)

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    kimo schrieb:

    den Loop brauche ich um permanent die Video-Zeit abzufragen

    Geht mit einem Timer der alle 1000ms durchläuft auch.
    Und wenn du es öfter brauchst stzt du einfach das Interval runter.

    Also, du brauchst die Schleife NICHT !!! Lass dir doch auch mal was sagen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo

    Ich kann dir nur nochmals die Forensuche ans Herz legen. Das Thema wird sicher 1x/Woche erfragt.
    z.b. Me.Dispatcher.Invoke wird nicht erkannt

    Aber mit nem Timer brauchst du das alles nicht. Kannst du dir sparen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hier ein kleiner Denkanstoss:

    VB.NET-Quellcode

    1. Imports System.Timers.Timer
    2. Public Class Form1
    3. Private _timer As New Timers.Timer() With {.Interval = 1000}
    4. Public Sub New()
    5. InitializeComponent()
    6. AddHandler Me.AxWindowsMediaPlayer1.PlayStateChange, AddressOf AxWindowsMediaPlayer1_PlayStateChange
    7. AddHandler _timer.Elapsed, AddressOf _timer_Elasped
    8. Me.AxWindowsMediaPlayer1.URL = "E:\music\Deep Bass Future Garage Mix (Into the Future).mp4"
    9. End Sub
    10. Private Sub _timer_Elasped(sender As Object, e As Timers.ElapsedEventArgs)
    11. Me.BeginInvoke(New Action(Sub()
    12. Me.Text = Me.AxWindowsMediaPlayer1.Ctlcontrols.currentPosition.ToString()
    13. End Sub), Nothing)
    14. End Sub
    15. Private Sub AxWindowsMediaPlayer1_PlayStateChange(sender As Object, e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent)
    16. If e.newState = 3 Then
    17. _timer.Start()
    18. Else
    19. _timer.Stop()
    20. End If
    21. End Sub
    22. End Class


    Beachte bitte, dass es mehrere Arten von Timer gibt. Ich nutze hier den Timer aus dem System.Timers-Namespace, welcher asynchron läuft. Du musst auch hier aufpassen, wenn Du auf Steuerelemente schreibend zugreifst. Das Stichwort heisst hier Invoke/BeginInvoke. Eine Funktion, welche ein Delegate (hier Action) entgegennimmt und entsprechend im MainThread (Form) ausführt/einhängt, wie auch immer.

    Du kannst natürlich auch den Windows.Forms.Timer nehmen, welcher synchron zum MainThread läuft, hier entfällt das Invoke. Was hier besser ist, kann ich Dir leider nicht sagen. Ich bevorzuge meist den asynchronen Timer. Gewählt habe ich diesen auch hier bewusst, um Dir zu zeigen, wie man aus anderen Threads auf Steuerelemente zugreifen kann. Es gibt mehrere Varianten, dies zu machen.

    Edit: Fast vergessen. Benutze nicht dieses grässliche Steuerelement, welches sich MediaPlayer schimpft.

    https://github.com/filoe/cscore

    Das hier ist mit das beste an Software, was dieses Forum je hervorgebracht hat. @thefiloe ist der Author davon. Arbeite Dich lieber da rein, als Deine Zeit mit dem MediaPlayerControl zu verschwenden.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

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

    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!
    Warum speicherst Du den Playerzustand nicht in einer Variable, deren Wert Du dann im Thread ausliest?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    Hallo.
    Den Playerzustand (PlayState) kann ich in eine Variable speichern und abfragen. Aber ich muss auch die laufende Video-Zeit (currentPosition) abfragen und diese in einem Chart darstellen. Diese ändert sich ja ständig wenn das Video läuft.
    Konnte das Ganze dank Eurer Hilfe zwar von Loop auf Timer umbauen, aber das mit dem Control Abfragen aus einem anderen Thread hab ich noch nicht hinbekommen. :(

    Gruss Armin

    kimo schrieb:

    das mit dem Control Abfragen aus einem anderen Thread
    ist nicht erforderlich, wenn Du einen System.Windows.Forms.Timer verwendest, den kannst Du Dir einfach im Designer auf Deine GUI ziehen und feddich.
    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 habe den System.Windows.Forms.Timer verwendet.
    Mein Problem ist, dass das Chart "ruckelt" wenn ich mit der Maus drüber fahre. Weil dort laufend die Video Position angezeigt wird. Ich dachte dass ich dieses Problem evtl. mit einem zweiten Thread beheben könnte.. Zuerst habe ich einen Loop mit DoEvents benutzt, jetzt mit dem Timer brauche ich kein DoEvents mehr.. aber es ruckelt immer noch :(

    Armin

    kimo schrieb:

    das Chart "ruckelt"
    Was hat das mit dem MediaPlayer zu tun?
    Welcher Code steht im MouseMove-Event?
    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!