1. 程式人生 > >事件模型-溫度預警問題

事件模型-溫度預警問題

基於事件驅動的程式設計是目前主流的程式設計方法,它是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控制元件,在該控制元件方法中寫入程式碼,以觸發事件並模擬溫度的變化。