事件模型-温度预警问题
基于事件驱动的程序设计是目前主流的程序设计方法,它是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控件,在该控件方法中写入代码,以触发事件并模拟温度的变化。