事件模型-溫度預警問題
阿新 • • 發佈:2018-12-03
基於事件驅動的程式設計是目前主流的程式設計方法,它是windows應用程式設計和Web應用程式設計的基礎。但長期以來,基於事件驅動模型都被廣大初學者視為難以理解的內容。
其實,事件驅動的程式設計並不難理解,其過程與防災救災是相通的。
完整的時間處理系統必須包含以下三大組成要素:
1、事件源:指能出發事件的物件,有時又稱為事件的傳送者或事件的釋出者。
2、偵聽器:指能接受到事件訊息的物件。Windows提供了基礎的事件偵聽服務。
3、時間處理程式:在事件發生時能對事件進行有效處理,又稱事件方法或事件函式。包含事件處理程式的物件稱為事件的接受者,有時又稱事件的訂閱者。
其實現步驟包括5個步驟:
1、定義事件相關資訊類
2、在事件釋出類(事件源)中宣告事件,並宣告一個負責出發事件的方法
3、在事件接受者類中宣告事件發生時呼叫的方法
4、在事件接收者類中訂閱事件
5、在事件接收者類中觸發事件
本篇文章介紹一個用事件模型解決一個簡單的問題:溫度預警問題
模擬溫度,每秒變化一次,隨著溫度的自動變化顯示預警資訊。
執行結果:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Collections; namespace Test1_2 { public partial class Test1_2 : Form { Random r = new Random(); //產生一個隨機數生成器 TemperatureWarning tw = new TemperatureWarning(); //建立溫度報警器物件 public Test1_2() { InitializeComponent(); //第四步:訂閱事件 tw.OnWarning += new TemperatureWarning.TemperatureHandler(tw_OnWarning); } private void Test1_2_Load(object sender, EventArgs e) { } //第三步,宣告事件產生時呼叫的方法 public void tw_OnWarning(object sender, TemperatureEventArgs e) { if (e.Temperature < 35) { lblShow.Text = "正常"; lblColor.BackColor = Color.Blue; } else if (e.Temperature < 37) { lblShow.Text = "高溫黃色預警"; lblColor.BackColor = Color.Yellow; } else if (e.Temperature < 40) { lblShow.Text = "高溫橙色預警"; lblColor.BackColor = Color.Orange; } else { lblShow.Text = "高溫紅色預警"; lblColor.BackColor = Color.Red; } } private void bntDouble_Click(object sender, EventArgs e) { //啟動計時器,開始每一秒改變一次溫度 timer1.Enabled = true; } //每隔一秒激發一次該方法,用來模擬溫度值的改變 private void timer1_Tick(object sender, EventArgs e) { //現在的溫度值 int nowTemp = 0; if (textTemp.Text == "") nowTemp = 35; else nowTemp = int.Parse(textTemp.Text); int change = r.Next(-2, 3); //產生一個-2到2之間的隨機數 textTemp.Text = (nowTemp + change).ToString(); //新的溫度值 //第五步,觸發事件 tw.Monite(change + nowTemp); } } //第一步,定義事件相關資訊類 public class TemperatureEventArgs : EventArgs { private int temperature; //宣告建構函式 public TemperatureEventArgs(int temperature) { this.temperature = temperature; } //定義只讀屬性 public int Temperature { get { return temperature; } } } //第二步,定義事件警報器 public class TemperatureWarning { //2.1 宣告溫度預警的委託型別 public delegate void TemperatureHandler(object sender, TemperatureEventArgs e); //2.2宣告溫度預警事件 public event TemperatureHandler OnWarning; //2.3開始監控氣溫,同時釋出事件 public void Monite(int tp) { TemperatureEventArgs e = new TemperatureEventArgs(tp); if (OnWarning != null) { OnWarning(this, e); } } } }
其中,Random類是偽隨機數生成類,該類的Next(minValue, maxValue)方法可以產生一個大於等於minValue並小於maxValue的隨機整數。
Timer控制元件是一個計時器控制元件,可以週期性產生一個Tick事件,可以用該控制元件週期性的執行某些操作。當Timer控制元件的Enable屬性設定為true時,可以啟用該控制元件:設定為false時,關閉計時,Interval屬性是Timer控制元件的激發間隔,單位是毫秒。另外,一個事件方法只有訂閱後才能生效,為此需要雙擊Timer1控制元件,在該控制元件方法中寫入程式碼,以觸發事件並模擬溫度的變化。