【温度预警程序de开发】事件驱动模型实例运用

简介: 【温度预警程序de开发】事件驱动模型实例运用

写在开头:

事件驱动模型已经在前面的文章给大家做了简单而又生动形象的介绍了,接下
来将进行详细的介绍。欢迎关注小哥vx:“编程小哥令狐”。
【项目需求】
     开发一个温度实时监测程序,程序能够根据温度的变化提示温度变化情况,
对应发生颜色变化,增强提示效果。
【思路/体会】
     温度的实时变化可以通过生成对象调用随机函数,将值动态显示。颜色变化
可以通过Windows .NET库提供的颜色库进行调用。关键是你怎么启动成这个程序
启动了让它自行执行,这个可以启用Timmer控件,设置时间间隔,封装函数,外
部调用即可。整个开发贯穿的就是事件驱动编程的思想。

一.定义事件信息相关类与事件警报器

    为什么要谈到委托类型?委托就是一种可以动态调用方法的类型,属于引用型。C#实现事件驱动编程模型的主要途径就是利用委托类型实现动态调用方法。

    我们之前总是通过指针或者对象访问变量的内存地址,但现在我们需要利用委托对象引用方法的内存地址实现传递和调用。

     1.1第一步声明委托类型


我们自己定义了一个事件数据类型TemperatureEventArgs,它还是我们定义的一个,我们在里面封装好我们需要的数据信息

我们的类名就是我们的事件数据类型,它同样具有的所有特性,比如定义构造方法,方法,属性器等等。我们定义的事件数据类型TemperatureEventArgs,它是从EventArgs进行派生的。它的目的就是:

提供保存事件数据所需要的全部字段或者属性,这样事件的发布者就可以将特定的数据发送给接收者

class TemperatureEventArgs:EventArgs{
   private int temperature;
        //TemperatureEventArgs是一个类
        public TemperatureEventArgs(int temperature)//声明构造函数
        {
            this.temperature = temperature;
        }
        public int Temperate//定义只读属性
        {//专门定义一个Temperature方法来返回数据
            get
            {
                return temperature;
            }
        }
}

     1.2第二步定义事件警报器:

             1.2.1声明我们的委托类型


声明格式就是:

public delegate 返回值类型 委托类型名(object sender,事件数据类型 e);


code:

我们的委托类型名是自定义的哟!

public delegate void TemperatureHandler(object sender, TemperatureEventArgs e);

             1.2.2声明事件


声明格式就是:

public event 委托类型名 事件名;

PS: 事件名最好以On_开头比较规范!

public event TemperatureHandler OnWarning;

             1.2.3开始监控气温,同时发布事件

public void Monitor(int tp)
        {
            TemperatureEventArgs e = new TemperatureEventArgs(tp);
            if (OnWarning != null)
            {
                OnWarning(this, e);
            }
        }

             1.2.4声明事件时调用的方法

//第三步 声明事件时调用方法
        private void Tw_OnWarning(object sender, TemperatureEventArgs e)
        {
            if (e.Temperate < 35)
            {
                lblShow.Text = "正常";
                lblColor.BackColor = Color.Blue;
            }
            else if (e.Temperate < 37)
            {
                lblShow.Text = "高温黄色预警";
                lblColor.BackColor = Color.Yellow;
            }
            else if (e.Temperate < 40)
            {
                lblShow.Text = "高温橙色预警";
                lblColor.BackColor = Color.Orange;
            }
            else if (e.Temperate < 37)
            {
                lblShow.Text = "高温红色预警";
                lblColor.BackColor = Color.Red;
            }
        }
    }

二.事件调用

写上代码:

private void Tw_OnWarning(object sender, TemperatureEventArgs e)
        {
            if (e.Temperate < 35)
            {
                lblShow.Text = "正常";
                lblColor.BackColor = Color.Blue;
            }
            else if (e.Temperate < 37)
            {
                lblShow.Text = "高温黄色预警";
                lblColor.BackColor = Color.Yellow;
            }
            else if (e.Temperate < 40)
            {
                lblShow.Text = "高温橙色预警";
                lblColor.BackColor = Color.Orange;
            }
            else if (e.Temperate < 37)
            {
                lblShow.Text = "高温红色预警";
                lblColor.BackColor = Color.Red;
            }
        }

             2.1在事件接收者类中订阅事件

tw.OnWarning += new TemperatureWaring.TemperatureHandler(Tw_OnWarning);

订阅之前先声明好我们的对象

TemperatureWaring tw = new TemperatureWaring();

             2.2触发按钮启动计时

我们先设置好我们的timmer,调节时间间隔1000s

代码:

private void btnMonitor_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }
     private void timer1_Tick(object sender, EventArgs e)
        {
            int nowTemp;
            if (txtTemp.Text == "")
                nowTemp = 35;
            else
                nowTemp = Convert.ToInt32(txtTemp.Text);
            int change = r.Next(-2, 3);
            txtTemp.Text = (change + nowTemp).ToString();
            //第五步 触发事件
            tw.Monitor(change + nowTemp);
        }

三.效果图展示

             3.1图示

             3.2代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 实例8__3
{
    public partial class 温度监控 : Form
    {
        Random r = new Random();
        TemperatureWaring tw = new TemperatureWaring();
        public 温度监控()
        {
            InitializeComponent();
            //第四步 订阅事件
            tw.OnWarning += new TemperatureWaring.TemperatureHandler(Tw_OnWarning);
        }
        
 
        private void btnMonitor_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            int nowTemp;
            if (txtTemp.Text == "")
                nowTemp = 35;
            else
                nowTemp = Convert.ToInt32(txtTemp.Text);
            int change = r.Next(-2, 3);
            txtTemp.Text = (change + nowTemp).ToString();
            //第五步 触发事件
            tw.Monitor(change + nowTemp);
        }
        //第三步 声明事件时调用方法
        private void Tw_OnWarning(object sender, TemperatureEventArgs e)
        {
            if (e.Temperate < 35)
            {
                lblShow.Text = "正常";
                lblColor.BackColor = Color.Blue;
            }
            else if (e.Temperate < 37)
            {
                lblShow.Text = "高温黄色预警";
                lblColor.BackColor = Color.Yellow;
            }
            else if (e.Temperate < 40)
            {
                lblShow.Text = "高温橙色预警";
                lblColor.BackColor = Color.Orange;
            }
            else if (e.Temperate < 37)
            {
                lblShow.Text = "高温红色预警";
                lblColor.BackColor = Color.Red;
            }
        }
    }
    
}
//第一步 定义事件相关信息类
class TemperatureEventArgs : EventArgs
    {
        private int temperature;
        //TemperatureEventArgs是一个类
        public TemperatureEventArgs(int temperature)//声明构造函数
        {
            this.temperature = temperature;
        }
        public int Temperate//定义只读属性
        {//专门定义一个Temperature方法来返回数据
            get
            {
                return temperature;
            }
        }
    }
//第二步:定义事件警报器
class TemperatureWaring
    {
        //1.声明委托类型
        public delegate void TemperatureHandler(object sender, TemperatureEventArgs e);
        //2.声明温度预警事件
        public event TemperatureHandler OnWarning;
        //3.开始监控气温,同时发布事件
        public void Monitor(int tp)
        {
            TemperatureEventArgs e = new TemperatureEventArgs(tp);
            if (OnWarning != null)
            {
                OnWarning(this, e);
            }
        }
    }

             3.3代码下载地址

https://jackieling.github.io/Temperature_Control/.

链接:https://pan.baidu.com/s/1gcev1XFanHTPIY2ahJ4d0A

提取码:zgu9


目录
相关文章
|
存储 编解码 缓存
视频平台技术成本控制的量化方法
在线视频平台为用户提供服务时,面临的一个严重的挑战是,如何保证在为用户提供流畅 且稳定播放服务的前提下,尽量降低整体运营成本。本篇文章将围绕上述问题,重点讨论技术实践中的成本控制手段。
视频平台技术成本控制的量化方法
|
7月前
|
传感器 存储 监控
示例一、集成温度传感器(DS1820)温度特性
示例一、集成温度传感器(DS1820)温度特性
271 1
|
3月前
|
人工智能 数据中心
使用光模块Breakout功能减少AI训练中断故障
本文介绍了使用大成鹏通信光模块Breakout功能可以减少AI训练中断故障的问题。通过Breakout功能,单通道故障不会中断其他通道的数据转发,有效解决了传统光模块因单通道故障导致的训练中断问题。同时,还介绍了如何利用Breakout功能进行更灵活的AI基础网络组网。
|
7月前
|
机器学习/深度学习 数据可视化 数据挖掘
R语言响应面(RSM)、线性模型lm分析生产过程影响因素可视化
R语言响应面(RSM)、线性模型lm分析生产过程影响因素可视化
|
7月前
配置AC和AP上报KPI指标信息实验
配置WLAN基本业务,使AP上线。 配置AC上报WMI服务器的对接参数。 配置通过WMI模板配置AP上报WMI服务器的对接参数,并通过AP系统模板将WMI模板绑定到AP组。
配置AC和AP上报KPI指标信息实验
|
7月前
|
传感器 机器学习/深度学习 算法
利用STM32实现自平衡机器人功能与方法
利用STM32实现自平衡机器人功能与方法
90 0
|
存储 传感器 Web App开发
TencentOS tiny危险气体探测仪产品级开发
TencentOS tiny危险气体探测仪产品级开发
127 0
|
算法 Python
【硕士论文完美复现】【价格型需求响应】基于需求侧响应的配电网供电能力综合评估(Matlab代码实现)
【硕士论文完美复现】【价格型需求响应】基于需求侧响应的配电网供电能力综合评估(Matlab代码实现)
164 0
|
监控 程序员 C++
[虚幻引擎] UE里面监控每帧循环里面 C++ 函数的性能,监控函数效率,函数执行时间。
在使用C++开发UE引擎,有时候需要监控函数的执行的执行效率,这个时候有两种方式可以使用。
210 0
|
监控
【乌拉喵.教程】“多负载识别监控平台(上位机)”技术细节 之Unit3-Form3用户负载类型查询界面
【乌拉喵.教程】“多负载识别监控平台(上位机)”技术细节 之Unit3-Form3用户负载类型查询界面
102 0