简介:
当我使用计算机工作时,我总是如此的专心致志,以至于每当我过了“一会儿”去看时间时,发现已经过了三个小时,而我却完全没有意识到!所以我决定使用我从Code Project学来的C#技术,来创建一个简单的应用程序—使用Timer 对象来倒计时一个由我自己设定的时间,并一直循环播放一段wave音乐,直到你重设timer控件。
Timer对象基础
首先你要知道的是,使用Timer对象你需要访问如下命名空间: using System.Threading; using System.Timers;
接下来,介绍一下创建一个Timer的要点以及为这个timer对象的Elapsed事件设定事件委派。
先创建一个Timer对象,这里我定义我使用的timer为timerClock 。接下来设定Elapsed 事件委派,当事件被触发时,指定的委派将被调用,这里我定义我使用的委派名称为OnTimer() 。
接着,设定Interval 属性,使用毫秒数值指示希望Elapsed 事件被调用的间隔,这意味着,当我定义Interval 属性为1000毫秒时,我定义的委派OnTimer() 将每隔1000毫秒被调用一次,或者说是每隔1秒。
最后,需要设定Enabled 属性为true,以使这个timer对象开始工作。接下来,剩下的只是一个小问题—创建一个委派,在这个timer对象的Elapsed 属性被触发时调用。如果你以前没有使用过委派,不用担心,它们很容易使用,只需要创建一个方法,用来接收适合你捕获事件的一些变量。
针对Elapsed 事件,这个委派需要接收一个普通对象和一个ElapsedEventArgs 对象。 private System.Timers.Timer timerClock = new System.Timers.Timer(); timerClock.Elapsed += new ElapsedEventHandler(OnTimer); timerClock.Interval = 1000; timerClock.Enabled = true; public void OnTimer( Object source, ElapsedEventArgs e ) { }
在报警程序中使用Timer控件
好的,介绍了这些基础,现在,我们来看在实际应用中的代码。注意,这里并不包括播放wave音乐和显示最小化图标的代码,完整的代码你可以在那个demo项目中看到,基本上我是直接从jow Blow撰写的《Low level audio players》中粘贴的播放wave的代码。
在下面的代码中,你可以看到,我将实例化Timer对象的方法放在我自己的初始化方法InitializeTimer() 中,这个方法将被类构造调用。并且我创建了两个方法,inputToSeconds() 和secondsToTime() 用来将字符串格式的时间格式转换为正型,以及一个反处理过程。这些方法只是用来帮助我们在TextBox控件中显示日期格式,这在整个应用的结构中,并不十分重要。其他的那些代码,是标准的Visual Studio.NET为Win Form程序生成的样板文件。 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading; using System.Timers; using System.IO; using System.Reflection; namespace timerAlarm { public class TimerForm : System.Windows.Forms.Form { private System.Windows.Forms.TextBox timerInput; private System.Windows.Forms.Button StartButton; private System.Windows.Forms.Button ResetButton; private System.ComponentModel.IContainer components; private System.Timers.Timer timerClock = new System.Timers.Timer(); private int clockTime = 0; private int alarmTime = 0; public TimerForm() { InitializeComponent(); InitializeTimer(); } protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code #endregion public void InitializeTimer() { this.timerClock.Elapsed += new ElapsedEventHandler(OnTimer); this.timerClock.Interval = 1000; this.timerClock.Enabled = true; } [STAThread] static void Main() { Application.Run(new TimerForm()); } private void TimerForm_Resized(object sender, System.EventArgs e) { if( this.WindowState == FormWindowState.Minimized ) { this.Hide(); } } private void StartButton_Click(object sender, System.EventArgs e) { this.clockTime = 0; inputToSeconds( this.timerInput.Text ); } private void ResetButton_Click(object sender, System.EventArgs e) { try { this.clockTime = 0; this.alarmTime = 0; this.timerInput.Text = "00:00:00"; } catch( Exception ex ) { MessageBox.Show("ResetButton_Click(): " + ex.Message ); } } public void OnTimer(Object source, ElapsedEventArgs e) { try { this.clockTime++; int countdown = this.alarmTime - this.clockTime ; if( this.alarmTime != 0 ) { this.timerInput.Text = secondsToTime(countdown); } if( this.clockTime == this.alarmTime ) { MessageBox.Show("Play Sound"); } } catch( Exception ex ) { MessageBox.Show("OnTimer(): " + ex.Message ); } } private void inputToSeconds( string timerInput ) { try { string[] timeArray = new string[3]; int minutes = 0; int hours = 0; int seconds = 0; int occurence = 0; int length = 0; occurence = timerInput.LastIndexOf(":"); length = timerInput.Length; if( occurence == -1 || length != 8 ) { MessageBox.Show("Invalid Time Format."); ResetButton_Click( null, null ); } else { timeArray = timerInput.Split(':'); seconds = Convert.ToInt32( timeArray[2] ); minutes = Convert.ToInt32( timeArray[1] ); hours = Convert.ToInt32( timeArray[0] ); this.alarmTime += seconds; this.alarmTime += minutes*60; this.alarmTime += (hours*60)*60; } } catch( Exception e ) { MessageBox.Show("inputToSeconds(): " + e.Message ); } } public string secondsToTime( int seconds ) { int minutes = 0; int hours = 0; while( seconds >= 60 ) { minutes += 1; seconds -= 60; } while( minutes >= 60 ) { hours += 1; minutes -= 60; } string strHours = hours.ToString(); string strMinutes = minutes.ToString(); string strSeconds = seconds.ToString(); if( strHours.Length < 2 ) strHours = "0" + strHours; if( strMinutes.Length < 2 ) strMinutes = "0" + strMinutes; if( strSeconds.Length < 2 ) strSeconds = "0" + strSeconds; return strHours + ":" + strMinutes + ":" + strSeconds; } } }
代码参考
实际的执行代码比上面的要多,但demo中关于播放wave音频的代码是取自Ianier Munoz关于A low-level audio player in C#一文,顺便一提,Ianier Munoz编写的播放wave的这个类十分便于使用和重用。
总结
这个应用程序演示了timer在实际环境中的一个简单应用,仅仅使用了一些简单的基础知识来创建一个简单的应用,我希望在我之后有人能给出它的更多更好的用法。 
|