当前位置:网站首页>【温度预警程序de开发】事件驱动模型实例运用
【温度预警程序de开发】事件驱动模型实例运用
2022-08-05 09:52:00 【51CTO】
写在开头:
事件驱动模型已经在前面的文章给大家做了简单而又生动形象的介绍了,接下
来将进行详细的介绍。欢迎关注小哥vx:“编程小哥令狐”。
【项目需求】
开发一个温度实时监测程序,程序能够根据温度的变化提示温度变化情况,
对应发生颜色变化,增强提示效果。
【思路/体会】
温度的实时变化可以通过生成对象调用随机函数,将值动态显示。颜色变化
可以通过Windows .NET库提供的颜色库进行调用。关键是你怎么启动成这个程序
启动了让它自行执行,这个可以启用Timmer控件,设置时间间隔,封装函数,外
部调用即可。整个开发贯穿的就是事件驱动编程的思想。
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
文章目录
- 一.定义事件信息相关类与事件警报器
- 1.1第一步声明委托类型
- 1.2第二步定义事件警报器:
- 1.2.1声明我们的委托类型
- 1.2.2声明事件
- 1.2.3开始监控气温,同时发布事件
- 1.2.4声明事件时调用的方法
- 二.事件调用
- 2.1在事件接收者类中订阅事件
- 2.2触发按钮启动计时
- 三.效果图展示
- 3.1图示
- 3.2代码
- 3.3代码下载地址
一.定义事件信息相关类与事件警报器
为什么要谈到委托类型?委托就是一种可以动态调用方法的类型,属于引用型。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.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
1.2第二步定义事件警报器:
1.2.1声明我们的委托类型
声明格式就是:
public delegate 返回值类型 委托类型名(object sender,事件数据类型 e);
code:
我们的委托类型名是自定义的哟!
1.2.2声明事件
声明格式就是:
public event 委托类型名 事件名;
PS: 事件名最好以On_
开头比较规范!
1.2.3开始监控气温,同时发布事件
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;
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
二.事件调用
写上代码:
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;
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
2.1在事件接收者类中订阅事件
订阅之前先声明好我们的对象
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);
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
三.效果图展示
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);
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
3.3代码下载地址
https://jackieling.github.io/Temperature_Control/.
链接:https://pan.baidu.com/s/1gcev1XFanHTPIY2ahJ4d0A
提取码:zgu9
边栏推荐
猜你喜欢
mysql进阶(二十七)数据库索引原理
什么是CRM决策分析管理?
IDEA performs the Test operation, resulting in duplicate data when data is inserted
Egg framework usage (1)
汇编语言(8)x86内联汇编
hcip BGP enhancement experiment
After Keil upgrades to AC6, what changes?
eKuiper Newsletter 2022-07|v1.6.0:Flow 编排 + 更好用的 SQL,轻松表达业务逻辑
微服务 技术栈
皕杰报表的下拉框联动
随机推荐
leetcode: 529. 扫雷游戏
歌词整理
openpyxl to manipulate Excel files
使用工具类把对象中的null值转换为空字符串(集合也可以使用)
IDEA performs the Test operation, resulting in duplicate data when data is inserted
Excuse me if you want to write data in mysql, with flink - connector - JDBC directly is ok, but I'm in the f
开源一夏|OpenHarmony如何查询设备类型(eTS)
浅析WSGI协议
IDEA执行Test操作导致数据插入时出现了重复数据
开发常用手册链接分享
只有一台交换机,如何实现主从自动切换之nqa
The difference between find, matches, lookingAt matching strings in matcher
IO stream articles -- based on io stream to realize folder copy (copy subfolders and files in subfolders) full of dry goods
CCVR eases heterogeneous federated learning based on classifier calibration
Brief Analysis of WSGI Protocol
深度学习21天——卷积神经网络(CNN):天气识别(第5天)
There is only one switch, how to realize the nqa of master-slave automatic switching
Excuse me, guys, is it impossible to synchronize two databases in real time using Flink SQL CDC?
2022-08-01 Review the basic binary tree and operations
Happens-before rules for threads