首页 > 解决方案 > 如何立即摆脱循环

问题描述

我有一个小问题。我用哔哔的方法做了一个非常简单的闹钟。我必须按一个键才能停止哔声,它工作正常,但哔声在循环结束时停止(大约需要 10 秒)。我希望哔哔声在我按下键的那一纳秒处停止,怎么做?

这是我的程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace beep
{
    class Program
    {
        static void Main(string[] args)
        {
            int année = 2019;
            int mois = 09;
            int jour;
            int heure;
            int minute;
            int secondes = 00;
            do
            {
                Console.WriteLine("taper le jour sous la forme jj");
                jour = Convert.ToInt32(Console.ReadLine());
                }
                while (jour < 1 || jour > 31);
                do
                {
                    Console.WriteLine("taper l'heure sous la forme hh");
                    heure = Convert.ToInt32(Console.ReadLine());
                }
            while (heure > 23);
            do
            {
                Console.WriteLine("taper les minutes sous la forme mm");
                minute = Convert.ToInt32(Console.ReadLine());
            }
            while (minute >59);

      var dnew = new DateTime(année, mois,jour,heure,minute,secondes);

        TimeSpan intervall = dnew - DateTime.Now;

        System.Threading.Thread.Sleep(intervall);
        Console.WriteLine();
        Console.WriteLine("REVEILLE TOI !!!!!!!!!!!!");
        Console.WriteLine();
        Console.WriteLine("appuyez sur une touche pour arrter l'alarme, sinon elle sonera pour l'éternitée");
        do

        {
            Console.Beep(659, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 167);
            Console.Beep(523, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 125);
            Console.Beep(784, 125);
            Console.Beep(32400, 375);
            Console.Beep(392, 125);
            Console.Beep(32400, 375);
            Console.Beep(523, 125);
            Console.Beep(32400, 250);
            Console.Beep(392, 125);
            Console.Beep(32400, 250);
            Console.Beep(330, 125);
            Console.Beep(32400, 250);
            Console.Beep(440, 125);
            Console.Beep(32400, 125);
            Console.Beep(494, 125);
            Console.Beep(32400, 125);
            Console.Beep(466, 125);
            Console.Beep(32400, 42);
            Console.Beep(440, 125);
            Console.Beep(32400, 125);
            Console.Beep(392, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 125);
            Console.Beep(784, 125);
            Console.Beep(32400, 125);
            Console.Beep(880, 125);
            Console.Beep(32400, 125);
            Console.Beep(698, 125);
            Console.Beep(784, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 125);
            Console.Beep(523, 125);
            Console.Beep(32400, 125);
            Console.Beep(587, 125);
            Console.Beep(494, 125);
            Console.Beep(32400, 125);
            Console.Beep(523, 125);
            Console.Beep(32400, 250);
            Console.Beep(392, 125);
            Console.Beep(32400, 250);
            Console.Beep(330, 125);
            Console.Beep(32400, 250);
            Console.Beep(440, 125);
            Console.Beep(32400, 125);
            Console.Beep(494, 125);
            Console.Beep(32400, 125);
            Console.Beep(466, 125);
            Console.Beep(32400, 42);
            Console.Beep(440, 125);
            Console.Beep(32400, 125);
            Console.Beep(392, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 125);
            Console.Beep(784, 125);
            Console.Beep(32400, 125);
            Console.Beep(880, 125);
            Console.Beep(32400, 125);
            Console.Beep(698, 125);
            Console.Beep(784, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 125);
            Console.Beep(523, 125);
            Console.Beep(32400, 125);
            Console.Beep(587, 125);
            Console.Beep(494, 125);
            Console.Beep(32400, 375);
            Console.Beep(784, 125);
            Console.Beep(740, 125);
            Console.Beep(698, 125);
            Console.Beep(32400, 42);
            Console.Beep(622, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 167);
            Console.Beep(415, 125);
            Console.Beep(440, 125);
            Console.Beep(523, 125);
            Console.Beep(32400, 125);
            Console.Beep(440, 125);
            Console.Beep(523, 125);
            Console.Beep(587, 125);
            Console.Beep(32400, 250);
            Console.Beep(784, 125);
            Console.Beep(740, 125);
            Console.Beep(698, 125);
            Console.Beep(32400, 42);
            Console.Beep(622, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 167);
            Console.Beep(698, 125);
            Console.Beep(32400, 125);
            Console.Beep(698, 125);
            Console.Beep(698, 125);
            Console.Beep(32400, 625);
            Console.Beep(784, 125);
            Console.Beep(740, 125);
            Console.Beep(698, 125);
            Console.Beep(32400, 42);
            Console.Beep(622, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 167);
            Console.Beep(415, 125);
            Console.Beep(440, 125);
            Console.Beep(523, 125);
            Console.Beep(32400, 125);
            Console.Beep(440, 125);
            Console.Beep(523, 125);
            Console.Beep(587, 125);
            Console.Beep(32400, 250);
            Console.Beep(622, 125);
            Console.Beep(32400, 250);
            Console.Beep(587, 125);
            Console.Beep(32400, 250);
            Console.Beep(523, 125);
            Console.Beep(32400, 1125);
            Console.Beep(784, 125);
            Console.Beep(740, 125);
            Console.Beep(698, 125);
            Console.Beep(32400, 42);
            Console.Beep(622, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 167);
            Console.Beep(415, 125);
            Console.Beep(440, 125);
            Console.Beep(523, 125);
            Console.Beep(32400, 125);
            Console.Beep(440, 125);
            Console.Beep(523, 125);
            Console.Beep(587, 125);
            Console.Beep(32400, 250);
            Console.Beep(784, 125);
            Console.Beep(740, 125);
            Console.Beep(698, 125);
            Console.Beep(32400, 42);
            Console.Beep(622, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 167);
            Console.Beep(698, 125);
            Console.Beep(32400, 125);
            Console.Beep(698, 125);
            Console.Beep(698, 125);
            Console.Beep(32400, 625);
            Console.Beep(784, 125);
            Console.Beep(740, 125);
            Console.Beep(698, 125);
            Console.Beep(32400, 42);
            Console.Beep(622, 125);
            Console.Beep(32400, 125);
            Console.Beep(659, 125);
            Console.Beep(32400, 167);
            Console.Beep(415, 125);
            Console.Beep(440, 125);
            Console.Beep(523, 125);
            Console.Beep(32400, 125);
            Console.Beep(440, 125);
            Console.Beep(523, 125);
            Console.Beep(587, 125);
            Console.Beep(32400, 250);
            Console.Beep(622, 125);
            Console.Beep(32400, 250);
            Console.Beep(587, 125);
            Console.Beep(32400, 250);
            Console.Beep(523, 125);





        }
        while (Console.KeyAvailable == false);
    }
}
}

标签: c#

解决方案


为了更精确地控制声音播放,您需要使用 Windows 中更高级的 API 之一,例如 DirectSound 或 MediaPlayer,甚至是 XAudio2。但是这些 API 可能很难使用,尤其是对于刚接触编程的人来说。而且它们是基于波形的,因此如果您想要基于音符的方法,则需要包含一些层,例如不同音符的不同波形,或播放 MIDI(MediaPlayer 支持)。

也就是说,如果您只是循环播放音符,检查每次调用Console.Beep(). 例如:

struct Beep
{
    public readonly int Frequency;
    public readonly int Duration;

    public Beep(int frequency, int duration)
    {
        Frequency = frequency;
        Duration = duration;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine();
        Console.WriteLine("REVEILLE TOI !!!!!!!!!!!!");
        Console.WriteLine();
        Console.WriteLine("appuyez sur une touche pour arrter l'alarme, sinon elle sonera pour l'éternitée");
        _PlaySong();
    }

    private static void _PlaySong()
    {
        while (true)
        {
            foreach (Beep beep in _beeps)
            {
                if (Console.KeyAvailable) return;
                Console.Beep(beep.Frequency, beep.Duration);
            }
        }
    }

    private static readonly Beep[] _beeps =
    {
            new Beep(659, 125),
            new Beep(659, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 167),
            new Beep(523, 125),
            new Beep(659, 125),
            new Beep(32400, 125),
            new Beep(784, 125),
            new Beep(32400, 375),
            new Beep(392, 125),
            new Beep(32400, 375),
            new Beep(523, 125),
            new Beep(32400, 250),
            new Beep(392, 125),
            new Beep(32400, 250),
            new Beep(330, 125),
            new Beep(32400, 250),
            new Beep(440, 125),
            new Beep(32400, 125),
            new Beep(494, 125),
            new Beep(32400, 125),
            new Beep(466, 125),
            new Beep(32400, 42),
            new Beep(440, 125),
            new Beep(32400, 125),
            new Beep(392, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 125),
            new Beep(784, 125),
            new Beep(32400, 125),
            new Beep(880, 125),
            new Beep(32400, 125),
            new Beep(698, 125),
            new Beep(784, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 125),
            new Beep(523, 125),
            new Beep(32400, 125),
            new Beep(587, 125),
            new Beep(494, 125),
            new Beep(32400, 125),
            new Beep(523, 125),
            new Beep(32400, 250),
            new Beep(392, 125),
            new Beep(32400, 250),
            new Beep(330, 125),
            new Beep(32400, 250),
            new Beep(440, 125),
            new Beep(32400, 125),
            new Beep(494, 125),
            new Beep(32400, 125),
            new Beep(466, 125),
            new Beep(32400, 42),
            new Beep(440, 125),
            new Beep(32400, 125),
            new Beep(392, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 125),
            new Beep(784, 125),
            new Beep(32400, 125),
            new Beep(880, 125),
            new Beep(32400, 125),
            new Beep(698, 125),
            new Beep(784, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 125),
            new Beep(523, 125),
            new Beep(32400, 125),
            new Beep(587, 125),
            new Beep(494, 125),
            new Beep(32400, 375),
            new Beep(784, 125),
            new Beep(740, 125),
            new Beep(698, 125),
            new Beep(32400, 42),
            new Beep(622, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 167),
            new Beep(415, 125),
            new Beep(440, 125),
            new Beep(523, 125),
            new Beep(32400, 125),
            new Beep(440, 125),
            new Beep(523, 125),
            new Beep(587, 125),
            new Beep(32400, 250),
            new Beep(784, 125),
            new Beep(740, 125),
            new Beep(698, 125),
            new Beep(32400, 42),
            new Beep(622, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 167),
            new Beep(698, 125),
            new Beep(32400, 125),
            new Beep(698, 125),
            new Beep(698, 125),
            new Beep(32400, 625),
            new Beep(784, 125),
            new Beep(740, 125),
            new Beep(698, 125),
            new Beep(32400, 42),
            new Beep(622, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 167),
            new Beep(415, 125),
            new Beep(440, 125),
            new Beep(523, 125),
            new Beep(32400, 125),
            new Beep(440, 125),
            new Beep(523, 125),
            new Beep(587, 125),
            new Beep(32400, 250),
            new Beep(622, 125),
            new Beep(32400, 250),
            new Beep(587, 125),
            new Beep(32400, 250),
            new Beep(523, 125),
            new Beep(32400, 1125),
            new Beep(784, 125),
            new Beep(740, 125),
            new Beep(698, 125),
            new Beep(32400, 42),
            new Beep(622, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 167),
            new Beep(415, 125),
            new Beep(440, 125),
            new Beep(523, 125),
            new Beep(32400, 125),
            new Beep(440, 125),
            new Beep(523, 125),
            new Beep(587, 125),
            new Beep(32400, 250),
            new Beep(784, 125),
            new Beep(740, 125),
            new Beep(698, 125),
            new Beep(32400, 42),
            new Beep(622, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 167),
            new Beep(698, 125),
            new Beep(32400, 125),
            new Beep(698, 125),
            new Beep(698, 125),
            new Beep(32400, 625),
            new Beep(784, 125),
            new Beep(740, 125),
            new Beep(698, 125),
            new Beep(32400, 42),
            new Beep(622, 125),
            new Beep(32400, 125),
            new Beep(659, 125),
            new Beep(32400, 167),
            new Beep(415, 125),
            new Beep(440, 125),
            new Beep(523, 125),
            new Beep(32400, 125),
            new Beep(440, 125),
            new Beep(523, 125),
            new Beep(587, 125),
            new Beep(32400, 250),
            new Beep(622, 125),
            new Beep(32400, 250),
            new Beep(587, 125),
            new Beep(32400, 250),
            new Beep(523, 125),
    };
}

为了清楚上面的代码,我去掉了你的例子的“闹钟”部分,你提示输入天、小时和分钟,然后在指定的持续时间内休眠,因为这部分与你的问题无关居然问了。

请注意,我还将您的笔记数据移动到专用的用户定义类型中,并将值存储在数组中。这为您提供了更多关于如何实现逻辑的灵活性,包括提供一种简单的方法来同时循环和检查键输入,而无需硬编码一堆对Console.Beep()和的调用Console.KeyAvailable

此实现将允许用户几乎在按下键后立即停止播放音符。仍然有一点延迟,因为只有在每个音符播放完毕后才能检查琴键,以及 Windows 本身即使在进程退出后仍会让正在进行的音符完成播放这一事实。但它与您在使用Console.Beep(). :)


推荐阅读