Multithreading in der WPF

  • WPF MVVM
  • .NET (FX) 4.5–4.8

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

    Hab mir grad sogar selbst auf die Schulter geklopft, obwohl ich durch Corona noch ein wenig angeschlagen bin, im Neuland einen Weg gefunden. Wie schaut das denn nun aus, in der Sub TrackEnd, könnte man nun an dieser Stelle Properties ändern, bzw. Commands starten ohne das es Probleme mit CrossThreading in Sachen GUI gibt?

    kafffee schrieb:

    FSK - Ist was aus dem Amateurfunkbereich oder?


    Kommt auch dabei vor, FM Radio kennst du sicher, FrequencyModulation, AM sicher auch, das wäre AmplitudeModulation, gibt aber noch viel mehr.
    en.wikipedia.org/wiki/Frequency-shift_keying
    In dem Fall ging es darum aus einer Bitfolge ein akustisches Signal zu erstellen(akustische Datenübertragung trifft wohl zu), diese sollte über die LineOut am PC sonst wohin. Also aus Nullen und Einsen wird ein Ton erzeugt, es werden 2 Frequenzen verwendet je für eine 0 und 1, das nicht kohärente Signal siehst so aus, aber wie du grad sicher vermutest, ist die Phasenumkehr beim Wechsel der Frequenz nicht gewollt. Die Phase steigt leicht, beim Wechsel der Frequenz sinkt sie wieder(kommt auch umgekehrt vor). Bei einen kohärenten Signal schwingt die Phase rauf und runter ohne plötzlich "die Richtung" zu wechseln.
    Bilder
    • Unbenannt.jpg

      12,34 kB, 416×166, 38 mal angesehen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „BitBrösel“ ()

    BitBrösel schrieb:

    Wie schaut das denn nun aus, in der Sub TrackEnd, könnte man nun an dieser Stelle Properties ändern, bzw. Commands starten ohne das es Probleme mit CrossThreading in Sachen GUI gibt?

    Jou also ich hab z.B. das hier drin, was mir dann den nächsten "geplanten" Track abspielt:

    VB.NET-Quellcode

    1. Private Sub TrackBeendet()
    2. 'hier icon auf play setzen, auch mittels Binding
    3. IsPlaying = False
    4. Select Case Wiederholen
    5. Case WiederholModus.NichtWiederholen
    6. If PlaylistGewaehlterIndex = Playlist.Count - 1 Then
    7. Return
    8. Else
    9. NaechsterTrack_Execute(Nothing)
    10. End If
    11. Case WiederholModus.PlaylistWiederholen
    12. If PlaylistGewaehlterIndex = Playlist.Count - 1 Then
    13. PlaylistGewaehlterIndex = 0
    14. Else
    15. PlaylistGewaehlterIndex = PlaylistGewaehlterIndex + 1
    16. End If
    17. SpieleNeuenTitel_Execute(Nothing)
    18. Case WiederholModus.MusiktitelWiederholen
    19. SpieleNeuenTitel_Execute(Nothing)
    20. End Select
    21. End Sub


    BitBrösel schrieb:

    In dem Fall ging es darum aus einer Bitfolge ein akustisches Signal zu erstellen

    Also dat wat ein Modem normalerweise macht...
    @BitBrösel
    Yep genau das meinte ich. Bloss dass das dann irgendwann auch ohne Umweg über den Telefonhörer ging und so dann schnellere DFÜ möglich war, weil dann natürlich die "Tonqualität" besser war, also sowas wie ein 56k-Modem...

    War auch mal mit 15 Jahren mein Traum sowas zu programmieren, aber da gabs noch keine Foren in dem Ausmass und die Visual Basic IDE hat noch paar hundert Mark gekostet.... Hab mich damals für Amatuerfunk interssiert aber bin halt absolut nicht mehr auf dem aktuellen Stand...

    Hast du eine praktische Verwendung für das?

    Man könnte ja auch einfach einen Sender ein- und ausschalten und so die Einsen und Nullen übertragen, aber das war damals technisch nicht drin, weil das Hoch- und Runterfahren des Transmitters eine zu lange "Latenz" hatte und somit keine realistischen Datenübertragungsraten erreicht werden konnten.

    Kennst du den Begriff Packet-Radio?

    Übrigens so sieht dann ein RelayCommand aus:

    VB.NET-Quellcode

    1. Private _SpieleNeuenTitel As ICommand
    2. Public ReadOnly Property SpieleNeuenTitel() As ICommand
    3. Get
    4. If _SpieleNeuenTitel Is Nothing Then _SpieleNeuenTitel = New RelayCommand(AddressOf SpieleNeuenTitel_Execute, Function(o) True)
    5. Return _SpieleNeuenTitel
    6. End Get
    7. End Property
    8. Public Sub SpieleNeuenTitel_Execute(obj As Object)
    9. AktuelleMP3Info = Playlist(PlaylistGewaehlterIndex)
    10. IsNewSong = True
    11. Abspielen_Execute(Nothing)
    12. IsNewSong = False
    13. Debug.WriteLine("SpieleNeuenTitel ausgelöst!")
    14. End Sub


    Der PlayButton dann im XAML z.B. so:

    XML-Quellcode

    1. <Button Content="Play" Command="{Binding SpieleNeuenTitel}"/>


    Also du bindest an die Property SpieleNeuenTitel

    Bei mir ist es jetz z.B. so, dass ich das per Klick auf den Button oder aber vom Code aus per SpieleNeuenTitel_Execute ausführen kann...

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

    kafffee schrieb:

    Kennst du den Begriff Packet-Radio?

    Jetzt ja, absolut interessant.

    Eine praktische Verwendung noch nicht, ich bin immer irgendwas am "studieren" was mich interessiert.
    Dieser Thread brachte mich auf den Geschmack:
    48Bit "Telegram" über Audio Ausgeben

    Hatte mir auch schon überlegt, mal so ein kleinen Transmitter/Receiver mit Mikrokontrollern zu machen, brauch aber erst noch Infos welche mir sicher ein Buch welches ich mir bald kaufe liefert. Einfach so senden weis ich nicht was(ob's überhaupt) erlaubt ist ohne Funklizenz, will ja keinen Störsender aus versehen in Betrieb nehmen. :D Könnte mir durchaus vorstellen auf so eine Art ein eigenes kleines Nachrichten Sende/Empfangs-System zu basteln, sei es nur um den Status der Batterie im Wohnmobil genau zu kennen.
    @BitBrösel

    Ja da schneidest du so ein Thema an. Es gibt verschiedene Amateurfunklinzenzen. Da hat sich in den letzten Jahren auch einiges getan soweit ich weiss... Also es wurde einiges gelockert. Damals musste man noch z. B. Morsen können mit einer bestimmten Geschwindigkeit und elektronisches Wissen haben, da durfte man dann auch seine eigenen Transmitter bauen. Aber wenn du mich fragst ist das zehn Mal umfangreicher und schwieriger als den Führerschein zu machen.

    Inwieweit man seine eigenen Transceiver o.ä. Im Frequenzbereich von CB-Funk (also der den man ohne Lizenz betreiben kann) jetzt heutzutage bauen darf müsstest du dich mal schlau machen, aber ich glaube eher, dass das nicht erlaubt ist.... Also da müsstest du wahrscheinlich die "kleine" Lizenz machen (E-Lizenz)... Musste mal googlen was man damit so alles darf...
    Hallo

    Ich habe jetzt nicht den ganzen Thread durchgelesen aber...

    Wenn du MVVM arbeitest sollten viele Threading probleme erst garnicht auftauchen.
    Grundsätzlich ist Multithreading in der WPF nicht großartig anders als unter WinForms.

    Warum verwendest du nicht Async/Await?
    Gibt es hier einen speziellen Grund?
    Wenn du mit Binding arbeitest solltest du viele Probleme erst garnicht bekommen.
    Solltest du dennoch einen Dispatcher benötigen dann kannst du diesen in MVVM mittels einem Service holen.

    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. ##

    Hey,

    scheinbar habe ich ein Talent für WPF ohne es gewusst zu haben, als ich den Source durchsah, war das mit dem Service etwas was ich vermutete, @kafffee, mit dem Service ist also nicht von hinten durch die Brust ins Auge.

    @Nofear23m Ich werde demnächst auch WPF lernen, kannst du neben deinem Tutorial ein gutes Buch(oder mehrere) empfehlen? Kosten spielen keine Rolle, sollte aber deutsch oder englisch sein, deutsch bevorzugt. Sollte ich erstmal ohne MVVM loslegen oder gleich das volle Programm? φConst machte ja eine Bemerkung, das kafffee sich vllt. erstmal "einfach" in WPF einarbeiten solle, daher bin ich mir nicht sicher was da der richtige Weg ist.

    Async/Await geht nicht weil die BASS eine Callback-Funktion in einem Nebenthread callt, da hat kafffee keine Einfluss drauf, aber da fand ich ja das mit dem ThreadPool.

    Nofear23m schrieb:

    Wenn du MVVM arbeitest sollten viele Threading probleme erst garnicht auftauchen.

    Ja, mal abgesehen von diesem Problem hatte ich das nur einmal. Aber da hab ich statt nem System.Timers.Timer einfach zu einem DispatcherTimer gegriffen...

    Nofear23m schrieb:

    Warum verwendest du nicht Async/Await?
    Gibt es hier einen speziellen Grund?

    Jou, hat @BitBrösel ja schon erwähnt...

    BitBrösel schrieb:

    dem Service ist also nicht von hinten durch die Brust ins Auge.

    Haha, okay ich nehm alles zurück :saint:

    BitBrösel schrieb:

    Sollte ich erstmal ohne MVVM loslegen oder gleich das volle Programm

    Also wenn du mich fragst gleich das volle Programm (also ich mein damit MVVM). Und am besten fängst du mit XAML an. Je öfter du was machst ums sicherer wirst du darin, also ein umfangreiches UI kann nicht schaden. Warum gleich MVVM? Man muss sich die Denkweise angewöhnen...
    Dafür kann ich die Videos von @Nofear23m empfehlen, die sind nicht zu schnell und nicht zu langsam.
    Ich selbst hab gleich mit einem grossen Projekt mit allen Schikanen angefangen und habs bisher nicht bereut, das hilft auch bei der Motivation wenn dann nachher was "brauchbares" rauskommt und ist nicht so trocken. Muss aber dazu sagen, dass ich für fast jede Funktion meines Programms ein Testprogramm gemacht hab...

    BitBrösel schrieb:

    Ich werde demnächst auch WPF lernen

    Brav ;) Nur mut.

    BitBrösel schrieb:

    kannst du neben deinem Tutorial ein gutes Buch(oder mehrere) empfehlen? Kosten spielen keine Rolle

    Leider nein. So gut wie alle lernen dir nur die WPF ansich. Also XAML, Syntax, Styles, Templates und der gleichen.
    Ich habe noch kein einziges Buch gefunden das MVVM mitbehandelt.
    Es gibt ein MVVM Buch, aber das geht wieder soooo stark rein (auch nur auf Englisch) das es mehr oder minder fast schon unverständlich ist und meißt fehlen schlicht Praxisbeispiele.

    Aber du kannst dich hier ja melden wenn du wo anstehst und dann schaun wir was wir machen können.

    Das wird schon.
    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. ##