控制台闹钟(一)

本文介绍如何利用C#编程实现一个简单的控制台应用程序,该程序具备闹钟功能。通过代码示例,展示了如何设置并触发定时提醒。
摘要由CSDN通过智能技术生成

代码如下:

//Program.cs
using System;
using System.Text.RegularExpressions;

namespace CK
{
    class Program
    {
        static void Main(string[] args)
        {
            SetClock();
            /*
            string cStr = Console.ReadLine();
            //使用 正则表达式 用 "" 替换 cStr 中 的空白字符
            string nStr = Regex.Replace(cStr, @"\s", "");

            int zero = String.Compare(cStr, 0, "clock", 0, 5);
            if (zero == 0 && cStr.Length == 5)
            {
                Help();
            }
            else
            {
                Console.WriteLine("语法错误");
                //重新输入
            }

                
                int value;
                value = Convert.ToInt32(cStr);
                Clock.Update(value);
             * */
        }

        static void SetClock()
        {
            string[] cStr = Environment.GetCommandLineArgs();
            
            //参数个数问题。。。
            if(cStr.Length == 1)
            {
                Help(); return;
            }
            else if (cStr.Length == 2)
            {
                switch (cStr[1])
                {
                    case "-help": Help(); break;
                    case "-music": Music(); break;
                    case "-version": Version(); break;
                    default: Error(); break;
                }
            }
            else if (cStr.Length == 3)
            {
                switch (cStr[1])
                {
                    case "-interval": Interval(cStr[2]); break;
                    default: Error(); break;
                }
            }
            else
            {
                Error();
                return;
            }
        }

        static void Help()
        {
            //用法
            Console.WriteLine("用法: clock <选项> <值>");
            //选项
            Console.WriteLine("  -help ");
            Console.WriteLine("  -interval <hh:mm:ss> ");
            Console.WriteLine("  -version");
            //示例
            Console.WriteLine("示例:");
            Console.WriteLine("     clock -help");
            Console.WriteLine("     clock -interval 00:00:05");
        }

        static void Interval(string value)
        {
            //是否含有 '0'-'9' 及 ':' 以外的字符
            bool match = Regex.IsMatch(value, @"[^0-9:]");

            if(match == true || value.Length != 8 || value[2] != ':' || value[5] != ':')
            {
                Error(); return;
            }

            //根据 ':' 分割成多个字符串
            string[] sStr = value.Split(new char[] {':'}, 3);

            int val;

            int val0 = Convert.ToInt32(sStr[0]);
            int val1 = Convert.ToInt32(sStr[1]);
            int val2 = Convert.ToInt32(sStr[2]);

            //为了避免产生异常,限制 0 < val2 < 60
            if(val0 >= 0 && val0 < 24 && val1 >= 0 && val1 < 60 && val2 > 0 && val2 < 60)
            {
                val = val0 * 3600 + val1 * 60 + val2;
                val *= 1000;
                Clock.Update(val);
            }
            else
            {
                Error(); return;
            }
        }

        static void Music()
        {

        }

        static void Version()
        {
            Console.WriteLine("clock version 1.0.0");
        }

        static void Error()
        {
            Console.WriteLine("语法错误");
        }
    }
}

//Clock.cs
using System;
using System.Timers;
using System.Media;

namespace CK
{
    class Clock
    {
        //用于设置 线程锁
        private static object lockClock = new Object();

        //定义 类级别 的 Timer
        private static Timer clockTimer = new Timer();

        //检查是否有锁
        private static bool check = false;

        //定义托盘消息
        private static System.Windows.Forms.NotifyIcon ni = new System.Windows.Forms.NotifyIcon();

        internal static void Update(int val)
        {
            //设置间隔时间
            clockTimer.Interval = val;
            //添加钩子:注册一个函数,在倒计时完成后调用
            clockTimer.Elapsed += new ElapsedEventHandler(OnTimedElapsed);
            //设置循环调用
            clockTimer.AutoReset = false;
            //开启 倒计时
            clockTimer.Enabled = true;

            Console.WriteLine("按下回车结束程序");
            Console.ReadLine();
        }

        private static void OnTimedElapsed(object sender, ElapsedEventArgs e)
        {
            //此处语义:如果 lockClock 未上锁,则上锁并执行 代码
            lock (lockClock)
            {
                if (check == false)
                {
                    check = true;
                    Console.WriteLine(e.SignalTime);

                    //为什么不使用 窗口提醒 呢:原因是这样做,如果用户不点击 确定 会干扰到后面程序的执行
                    //需要添加程序集引用
                    //System.Windows.Forms.MessageBox.Show("Time Out");
                    
                    //控制托盘消息:需要添加程序集引用
                    ni.Icon = new System.Drawing.Icon(@"..\Ico\alloyteam.github.io.ico");
                    ni.Visible = true;
                    ni.ShowBalloonTip(3000, "Time Out", "请注意", System.Windows.Forms.ToolTipIcon.Info);
                    SoundPlayer sound = new SoundPlayer(@"..\Music\alarm1.wav");
                    
                    sound.PlayLooping();
                }
                else
                {
                    //如果在此处无 return; 我们的代码就只能在 if 中调用
                    return;
                }
            }

            //Console.WriteLine(e.SignalTime);

            //同样在 未上锁 时执行,之所以加 lock,是避免上面的代码未执行完毕就执行此处
            //虽然在本例子中 有无加 lock 没有差别
            lock (lockClock)
            {
                check = false;
            }
        }

    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值