使用timer控制元件建立一個簡單的報警程式 (轉)

amyz發表於2007-08-16
使用timer控制元件建立一個簡單的報警程式 (轉)[@more@]

簡介::namespace prefix = o ns = "urn:schemas--com::office" />

  當我使用工作時,我總是如此的專心致志,以至於每當我過了“一會兒”去看時間時,發現已經過了三個小時,而我卻完全沒有意識到!所以我決定使用我從Code Project學來的技術,來建立一個簡單的應用—使用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( , ElapsedEventArgs e )


{


  //Your code here


}


在報警程式中使用Timer控制元件

  好的,介紹了這些基礎,現在,我們來看在實際應用中的程式碼。注意,這裡並不包括播放wave音樂和顯示最小化圖示的程式碼,完整的程式碼你可以在那個demo專案中看到,基本上我是直接從jow Blow撰寫的《Low level audio s》中貼上的播放wave的程式碼。

  在下面的程式碼中,你可以看到,我將例項化Timer物件的方法放在我自己的初始化方法InitializeTimer()中,這個方法將被類構造呼叫。並且我建立了兩個方法,inputToSeconds()secondsToTime()用來將字串格式的時間格式轉換為正型,以及一個反處理過程。這些方法只是用來幫助我們在TextBox控制元件中顯示日期格式,這在整個應用的結構中,並不十分重要。其他的那些程式碼,是標準的為Win Form程式生成的樣板。

using System;


using System.Drawing;


using System.Collections;


using System.ComponentModel;


using System..Forms;


using System.Data;


using System.Threading;


using System.Timers;


using System.IO;


using System.Reflection;




namespace timerAlarm


{


  public class TimerFo: System.Windows.Forms.Form


  {


  //Controls and Components


  private System.Windows.Forms.TextBox timerInput;


  private System.Windows.Forms.Button StartButton;


  private System.Windows.Forms.Button ResetButton;


  private System.ComponentModel.IContainer components;


  //Timer and associated variables


  private System.Timers.Timer timerClock = new System.Timers.Timer();


  private int clockTime = 0;


  private int alarmTime = 0;



  public TimerForm()


  {


  InitializeComponent();


  InitializeTimer();


  }



  protected overr 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);


   }



  //Sound Alarm


  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;



  //Check for invalid input


  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 stnutes = 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在實際環境中的一個簡單應用,僅僅使用了一些簡單的基礎知識來建立一個簡單的應用,我希望在我之後有人能給出它的更多更好的用法。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-962355/,如需轉載,請註明出處,否則將追究法律責任。

相關文章