Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.3k views
in Technique[技术] by (71.8m points)

vb.net - Function call only works when MessageBox.Show() is included?

In my current project I have a self-made audioplayer which is operated trough my musictimer() function. Below is a sub which orders the audioplayer to go to the next song when someone has clicked on a picture. This works perfectly.

Private Sub PictureBox4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox4.Click
    If (ListBox1.Items.Count - 1 > songBeingPlayed) Then
        musictimer("next")
    Else
        musictimer("stop")
    End If
End Sub

Below there is a sub which orders the player to play the next song when a song is finished playing. This sub also works but only when I have the MessageBox.Show("blabla") line in there. Otherwise it simply ignores the musictimer("next"). Obviously its quite annoying to have popup messages the entire times so I want it gone. Does anyone know whats going on? Im clueless.

Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
    If AxWindowsMediaPlayer1.playState = WMPLib.WMPPlayState.wmppsStopped Then
        musictimer("next")
        MessageBox.Show("blabla")
    End If
End Sub

My very messy musictimer function.

Function musictimer(ByVal action)
    If action Is "initial" Then
        TextBox1.Text = "0:00"
        Timer1.Stop()
        secondsCounter = 1
        doubledigitsecondCounter = 0
        minuteCounter = 0
    End If

    If action Is "reset" Then
        TextBox1.Text = "0:00"
        Timer1.Stop()
        secondsCounter = 1
        doubledigitsecondCounter = 0
        minuteCounter = 0
        Me.AxWindowsMediaPlayer1.URL = ""
        changePlayButton("play")
    End If

    If action Is "start" Then
        If (ListBox1.Items.Count > 0) Then
            Me.AxWindowsMediaPlayer1.URL = directoryPath + listboxpl(songBeingPlayed)
            AxWindowsMediaPlayer1.Ctlcontrols.play()
            Timer1.Start()
            changePlayButton("pause")
        End If
    End If

    If action Is "pause" Then
        Timer1.Stop()
        AxWindowsMediaPlayer1.Ctlcontrols.pause()
        changePlayButton("play")
    End If

    If action Is "next" Then
        If (ListBox1.Items.Count - 1 > songBeingPlayed) Then
            songBeingPlayed += 1
            musictimer("reset")
            musictimer("start")
            changePlayButton("pause")
        Else
            musictimer("pause")
        End If
    End If

    If action Is "previous" Then
        If (songBeingPlayed > 0) Then
            songBeingPlayed -= 1
            musictimer("reset")
            musictimer("start")
        End If
    End If
End Function
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The PlayStateChanged event is quite notorious. It was really meant to just update a UI element that shows the state. Doing anything with the player in that event is very troublesome. A call to MessagBox can have an affect because it pumps a message loop, always a big deal for ActiveX controls.

The best way to stay out of trouble is by delaying your code, making it run after the event was fired and the player is back into a quiescent state. Elegantly done by using the Control.BeginInvoke() method. Like this:

Private Sub AxWindowsMediaPlayer1_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles AxWindowsMediaPlayer1.PlayStateChange
    If e.newState = WMPLib.WMPPlayState.wmppsStopped Then
        Me.BeginInvoke(New Action(AddressOf NextSong))
    End If
End Sub

Private Sub NextSong()
    musictimer("next")
End Sub

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...