2012-12-07 12 views
5

kann ich nicht aufrufen Ich habe den folgenden Code: http://pastebin.com/EgjbzqA2, die im Grunde nur eine abgespeckte Version von http://www.dreamincode.net/forums/topic/57357-mymusic-player/ ist. Ich möchte, dass das Programm eine Datei wiederholt abspielt, diese Funktion funktioniert jedoch aus irgendeinem Grund nicht. Das Programm spielt jede Datei einmal ab und stoppt dann.WMPs controls.play() - Funktion in VisualBasic

Private Sub Player3_PlayStateChange(ByVal NewState As Integer) Handles Player3.PlayStateChange 
    Static Dim PlayAllowed As Boolean = True 
    Select Case CType(NewState, WMPLib.WMPPlayState) 
     Case WMPLib.WMPPlayState.wmppsReady 
      If PlayAllowed Then 
       Player3.controls.play() 
      End If 
     Case WMPLib.WMPPlayState.wmppsMediaEnded 
      ' Start protection (without it next wouldn't play 
      PlayAllowed = False 
      ' Play track 
      Player3.controls.play() 
      ' End Protection 
      PlayAllowed = True 
      updatePlayer() 
    End Select 
End Sub 

Antwort

1

Der PlayAllowed Doo-Wop ist Hackorama, um eine Kontrolle zu arbeiten, die verschroben wird, wenn Sie es bitten, etwas anderes in einem Ereignis zu tun. Das geht oft schief, sie erwarten nicht, dass die Bodenmatte beim Feuern eines Ereignisses zuckt. Der Fachausdruck ist, dass sie Reentrancy nicht gut behandeln, ein sehr häufiges Problem.

Es gibt eine sehr elegante Lösung für Neueintritt Probleme, ist der Schlüssel, dass Sie die Anfrage verzögern wieder das gleiche Lied zu spielen, nach das Ereignis ausgelöst wurde. In Winforms können Sie eine solche Verzögerung leicht erreichen, indem Sie Control.BeginInvoke() verwenden, das Ziel wird ausgeführt, nachdem sich alles wieder beruhigt hat. Der technische Ausdruck dafür ist "Warten, bis das Programm wieder in die Nachrichtenschleife eintritt". Das funktionierte sehr gut auf diesem Code, ich hatte keine Probleme, das gleiche Lied über Looping und immer wieder mit diesem Code, getestet auf Windows 8:

Public Class Form1 
    Dim WithEvents Player3 As New WMPLib.WindowsMediaPlayer 
    Dim Song As String = "c:\temp\ding.wav" 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     PlayCurrentSong() 
    End Sub 

    Private Sub Player3_PlayStateChange(ByVal NewState As Integer) Handles Player3.PlayStateChange 
     If NewState = WMPLib.WMPPlayState.wmppsMediaEnded Then 
      Me.BeginInvoke(New MethodInvoker(AddressOf PlayCurrentSong)) 
     End If 
    End Sub 

    Private Sub PlayCurrentSong() 
     Player3.URL = Song 
     Player3.controls.play() 
    End Sub 
End Class 

den Code Tweak wie benötigt, da es Ihnen nicht sehr gut passen . Der wesentliche Teil ist der Aufruf Me.BeginInvoke() im PlayStateChanged-Event-Handler.

+1

Funktioniert wie ein Charme! Sehr geschätzt. – ahota

+0

lol^tenmorechar – Dylansq

0

i looke in diesem und Problem ist, dass Sie zu hart versuchen, es so zu machen. Sie sehen, wenn Sie den Inhalt der eingekapselten MP3-Player-Dateien analysieren, werden Sie feststellen, dass die Schallmauer in analoge Dateien statt binär digital umgewandelt wird. Dieses Problem tritt auf, wenn es nur dem "WMP" zugewiesen wird, während Sie es als Video-Audio abspielen. Wenn du das Betriebssystem wechselst, könnte es funktionieren, aber ich würde weitermachen und nur einen neuen Computer kaufen und ihn stattdessen benutzen. danke und ty :)