需要在C#中使用秒表应用程序在特定时间播放声音警报

时间:2015-10-08 11:26:23

标签: c# audio

我写了一个简单的秒表应用程序,需要在一定时间间隔内播放声音警报。声音警报需要在15分钟标记,30分钟标记和1小时标记处播放。我已经设置了应用程序启动时播放的声音文件,但是我已经找到了如何让它在这些时间间隔播放的问题。下面的代码是代码的秒表部分 另请注意,我没有在此版本的代码中初始化声音。任何帮助将不胜感激。

using System;
using System.Diagnostics;
using System.IO;
using System.Media;
using System.Security.Cryptography.X509Certificates;
using System.Windows.Forms;

namespace CiscoSw
{
    public partial class SwForm : Form
    {

        private readonly Stopwatch _sw = new Stopwatch();

        internal SwForm()
        {
            InitializeComponent();
            startBtn.Text = @"Start";
            UpdateDisplay();
        }

        private void SwForm_Load(object sender, EventArgs e)
        {
            currentTimeUtc.Start();
        }

        private void startBtn_Click(object sender, EventArgs e)
        {
            if (!_sw.IsRunning)
            {
                _sw.Start();
                stopwatchTimer.Start();
                startBtn.Text = @"Stop";
                UpdateDisplay();
            }
            else
            {
                _sw.Stop();
                stopwatchTimer.Stop();
                startBtn.Text = @"Start";
            }
        }

        private void resetBtn_Click(object sender, EventArgs e)
        {
            if (_sw.IsRunning)
            {
                _sw.Restart();
            }
            else
            {
                _sw.Reset();
            }
            UpdateDisplay();
        }

        internal void stopwatchTimer_Tick(object sender, EventArgs e)
        {
            UpdateDisplay();
        }

        private void UpdateDisplay()
        {
           stopwatchTimeLabel.Text =
                $"{_sw.Elapsed.Hours.ToString("00")}:{_sw.Elapsed.Minutes.ToString("00")}:{_sw.Elapsed.Seconds.ToString("00")}";
        }

        private void currentTimeUtc_Tick(object sender, EventArgs e)
        {
            var now = DateTime.UtcNow;
            displayCurrentTime.Text = $"{now:M/d/yyyy   HHmm Zulu}";
        }
    }

}

此代码用于播放声音。现在我只在资源中有一个声音文件,一旦我正常工作,我将添加其他。此代码位于项目的单独文件中。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Media;
using System.Text;
using System.Threading.Tasks;
using static System.DateTime;

namespace CiscoSw
{
    public class TimerSound
    {
        public virtual void TimerSoundPlay() 
        {
            var fifteenminSound = new SoundPlayer(Properties.Resources.ResourceManager.GetObject("fifteenminutes") as Stream);
            fifteenminSound.Play(); 
        }

    }
}

2 个答案:

答案 0 :(得分:1)

一种选择是与秒表并行使用Timer,并在15分钟或任何时间间隔过去时在计时器上引发事件。在那个事件上发出声音。但是,您无法直接使用秒表附加事件

答案 1 :(得分:1)

这应该有效。我没有测试过代码。我使用System.Windows.Forms.Timer

编辑:我刚用较短的时间间隔对其进行测试,效果很好。我还将MakeSound调用移动到事件的结尾,以便它不会阻止重置计时器。

    Timer Timer15 = new Timer();
    Timer Timer30 = new Timer();
    Timer Timer60 = new Timer();

    public void SetupTimers()
    {            
        Timer15.Interval = 15 * 60 * 1000;
        Timer30.Interval = 30 * 60 * 1000;
        Timer60.Interval = 60 * 60 * 1000;

        Timer15.Tick += Timer_Tick;
        Timer30.Tick += Timer_Tick;
        Timer60.Tick += Timer_Tick;

        Timer15.Enabled = true;
        Timer30.Enabled = true; 
        Timer60.Enabled = true;
    }

    void Timer_Tick(object sender, EventArgs e)
    {
        Timer timer = sender as Timer;
        // Unsubscribe from the current event. Prevents multuple subscriptions. 
        timer.Tick -= Timer_Tick;   
        // If 60 minutes then reset all timers. 
        if (timer.Interval == 60 * 60 * 1000)
        {
            SetupTimers();
        } 

        //Call sound method here. 
        MakeSound();            
    }