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

事件模型-温度预警问题相关推荐

  1. memcached(二)事件模型源码分析

    在memcachedd中,作者为了专注于缓存的设计,使用了libevent来开发事件模型.memcachedd的时间模型同nginx的类似,拥有一个主进行(master)以及多个工作者线程(woker ...

  2. 回调函数与Delphi的事件模型

    回调函数: 回调函数是这样一种机制:调用者在初始化一个对象(这里的对象是泛指,包括OOP中的对象.全局函数等)时,将一些参数传递给对象,同时将一个调用者可以访问的函数地址传递给该对象.这个函数就是调用 ...

  3. 事件模型、事件流(冒泡与捕获)、事件代理

    本文原链接:https://www.cnblogs.com/hngdlxy143/p/9068282.html https://www.jb51.net/article/139997.htm 事件模型 ...

  4. .NET 事件模型教程(一)

    .NET 事件模型教程(一) .code { padding: 10px 10px 10px 10px; font-family: 宋体; background-color: #ececec } 目录 ...

  5. Delphi编写事件模型客户端(2)

    上次写了事件模型类的定义,今天我来写一写如何实现这个类. 首先的两个函数我想稍微了解网络编程的人都会清楚.<?xml:namespace prefix = o ns = "urn:sc ...

  6. 行为模型实例 php,JS中事件模型的实例详解

    之前对事件模型还是比较清楚的,许多概念都清晰映射在脑海中.工作之后,一方面使用的 局限性,二是习惯于用框架中的各种事件监听方式,简单即方便,久而久之,事件的一些概念开 始淡出记忆中,就像我现在已经开始 ...

  7. ActionScript 3.0 Step By Step系列(六):学对象事件模型,从点击按扭开始

    事件可以理解为所发生的.ActionScript 能够识别并可响应的事情.许多事件与用户交互有关 . 例如:用户单击按钮,或按键盘上的键 ― 但也有其它类型的事件.例如,如果使用 ActionScri ...

  8. JavaScript 复习之 事件模型 和 Event对象

    事件模型 一.监听函数 js 有三种方法,可以为事件绑定监听函数 HTML 的 on- 属性 元素节点的事件属性,也可以指定监听函数 EventTarget.addEventListener() DO ...

  9. javascript中0级DOM和2级DOM事件模型浅析

    Javascript程序使用的是事件驱动的设计模式,为一个元素添加事件监听函数,当这个元素的相应事件被触发那么其添加的事件监听函数就被调用: <input type="button&q ...

最新文章

  1. 我的第二故乡 - 长沙
  2. Python 列表 list() 方法
  3. 你所忽略的Linux系统安全及应用(最全面)
  4. Asp.net Ajax AlwaysVisibleControl使用方法
  5. 欢迎各位小伙伴们关注我的公众号,可以随时跟我在微信上进行交流
  6. Linux RabbitMQ+Erlang /sbin/service rabbitmq-server start 启动报错
  7. DbEntry 访问Access2010数据库
  8. php 微信公众 验证失败,微信公众平台token验证失败
  9. MDI打开文件时指定目录
  10. 挂牌!迎来【济南网络空间安全山东省实验室】等三所实验室!
  11. ESP8266开发之旅 阿里云物联网平台篇④ LED智能灯控制系统(MQTTS客户端直连)
  12. 机器人公司都吓傻了?因为谷东AR入局了嘛!
  13. 安卓报错:E/EGL_adreno: tid 2148: eglSurfaceAttrib(1338): error 0x3009 (EGL_BAD_MATCH)
  14. Eclipse体系结构介绍(一)
  15. 阿里力推“来往”,公众账号或成突破口
  16. HDU 1560 sequence
  17. LCL型并网逆变器的功率控制研究
  18. TUTK[MediaSDK][iOS]不出图或画面出现花屏
  19. Datastage常用组件使用方法(详尽版)
  20. 动态规划的一道题(室友约稿)

热门文章

  1. The following packages have unmet dependencies错误
  2. ios wifi 定位_iOS开发Wifi 定位原理及iOS Wifi 列表获取
  3. 【Java学习之代码学习】 Prog28_打印出杨辉三角形的问题
  4. 使用Python查看sqlite3表结构
  5. Java桌面应用程序设计新贵:SWT 简介
  6. Spark SQL架构工作原理及流程解析
  7. Antd点击select选择框,页面滚动,选项跟着滚动
  8. php实现报表拖拉拽,看!这款BI工具用拖拉拽的方式做报表
  9. 兴趣变高薪副业,知名插画师走尺带你感受插画的魅力
  10. fnl数据下载之requests,urllib等安装