【问题标题】:Simple example only works correctly first time, Why?简单的例子只能在第一次正常工作,为什么?
【发布时间】:2021-04-12 03:29:28
【问题描述】:

这是一个更大的 WPF 项目的简化 sn-p 来说明问题。

当按下播放按钮时,此代码播放 mp3 的“1, 2, 3, 4, 5”然后停止。

当按下播放按钮时,调度计时器启动。在每个 Tick 上,都会调用 Metronome_Run 事件。 Metronome_Run 事件通过索引数组来分配要播放的 mp3。

问题是,第一次按 play 时效果很好,得到 1,2,3,4,5,但再次按 play 时得到 2,4,5,然后再次按 play,得到3,5!好像每次按某种方式按下播放时,文件的索引似乎都会发生偏移。

当调试器单步执行时,它每次都能完美运行,但没有设置任何断点(就像在构建中一样),它仅在第一次正常工作,并且在进一步按下播放按钮时无法正常工作。

感谢任何帮助!

    public partial class MainWindow : Window
    {
        private MediaPlayer mediaPlayer = new MediaPlayer();
        List<int> NoteValArray = new List<int>() { 1,2,3,4,5 };
        private DispatcherTimer timer1;
        int numVal = 0;
        int numIndex = 0;
        private float tempo = 35f; 


        public MainWindow()
        {
            InitializeComponent();
            timer1 = new DispatcherTimer();
        }
        

        private void Metronome_Run(object sender, EventArgs e)
        {
            if (NoteValArray.Count > numIndex)      // if we are not outside the list bounds
            {
                numVal = NoteValArray[numIndex];    // get the value at this list index and place it in numVal
                numIndex ++;                        // increment
            }
            else { timer1.Stop(); return; } 

            // Load the mp3 indicated by numVal
            if (numVal == 1) { mediaPlayer.Open(new Uri("1.mp3", UriKind.Relative)); }
            else if (numVal == 2) { mediaPlayer.Open(new Uri("2.mp3", UriKind.Relative)); }
            else if (numVal == 3) { mediaPlayer.Open(new Uri("3.mp3", UriKind.Relative)); }
            else if (numVal == 4) { mediaPlayer.Open(new Uri("4.mp3", UriKind.Relative)); }
            else if (numVal == 5) { mediaPlayer.Open(new Uri("5.mp3", UriKind.Relative)); }
            mediaPlayer.Play(); // play whats loaded
        }
 
               
        private void Start_Button_Click(object sender, RoutedEventArgs e)
        {
            numIndex = 0; 

            timer1.Tick += Metronome_Run; // run this at each tick
            timer1.Interval = TimeSpan.FromMilliseconds(10000 / (tempo / 6)); 
            timer1.Start();
        }
    }
}

【问题讨论】:

    标签: events arraylist timer


    【解决方案1】:

    解决了! 我移动了“timer1 = new DispatcherTimer();”从主窗口函数中,并将其与其他计时器代码一起放在“Start_Button_Click”事件中。

    我的猜测是,我在每次播放时都会启动超过 1 个计时器,这就是导致该错误的原因。感谢所有花时间研究我的问题的人。

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 2015-09-24
      • 1970-01-01
      • 2017-05-29
      • 2017-07-16
      • 2019-10-08
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多