A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© continue  中级黑马   /  2014-5-14 11:27  /  1790 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 continue  于 2014-5-14 16:59 编辑

在自动切换到下一曲的时候,报了一个异常,真不知道怎么回事,求解决:

2014-05-14_112409.jpg (56.39 KB, 下载次数: 57)

2014-05-14_112409.jpg

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

2 个回复

正序浏览
希望朋友们如果有更好的解决办法
回复 使用道具 举报
问题解决了,贴上自己的代码,希望后面遇到同样问题的同学有帮助:
        #region 实现自动下一曲的功能
        //这个事件和StatueChange事件存在一个线程之间的调度问题,一个事件没有执行完成,后触发另外一个事件,另外一个事件中又会触发这个事件,结果就是有一个事件队列和事件压栈,可以通过单步调试来看看执行过程
        /// <summary>
        /// 实现自动下一曲的功能
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        ///
        private void axMediaPlayer_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
        {
            //在正常播放的时候,播放完成的状态,这个状态后,会重新读取媒体文件,此时重新赋值URL,但是这这个状态下调用播放是不起作用的
            if (listSong.Count < 0)
            {
                return;
            }
            
            if (axMediaPlayer.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
            {
                //int index = listShowSong.SelectedIndex;
                //index++;
                //if (index > listSong.Count - 1)
                //{
                //    listShowSong.SelectedIndex = 0;
                //    axMediaPlayer.URL = listSong[0];
                //}
                //else
                //{
                //  先改变选择项,后进行赋值
                //    listShowSong.SelectedIndex = index;
                //    axMediaPlayer.URL = listSong[index];
                //}
                //简写代码:
                axMediaPlayer.URL=listSong[ listShowSong.SelectedIndex + 1 > listSong.Count - 1 ? listShowSong.SelectedIndex = 0 : ++listShowSong.SelectedIndex];
            }
            //这个状态的判断必须要在上一个状态MediaEnded后面,因为需要在上一个状态中进行对URL赋值,同时,由于判断状态不一样,在事件的压栈上面处理的顺序也就不一样
            if (axMediaPlayer.playState == WMPLib.WMPPlayState.wmppsReady)
            {
                //添加下面这个判断的要求就是,在上一个MediaEnded中要先改变显示歌曲的listbox中的选择项,然后再对URL赋值,否则这个判断就不起作用。如果不添加这个判断,就会出现上面的错误
                if (axMediaPlayer.URL == listSong[listShowSong.SelectedIndex])
                {
                    axMediaPlayer.Ctlcontrols.play();
                }
            }
            
        }

        #endregion

上面代码中,axMediaPlayer是系统中的mediaplayer,listShowSong是界面上用来显示歌曲列表的listbox,listSong是后台中用来存放,对应于界面上歌曲列表的URL值

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马