代码如下:
//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;
}
}
}
}