当前位置:网站首页>【温度预警程序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
边栏推荐
- Advanced usage of C language
- Jenkins manual (2) - software configuration
- Keil升级到AC6后,到底有哪些变化?
- First Decentralized Heist?Loss of nearly 200 million US dollars: analysis of the attack on the cross-chain bridge Nomad
- Bias lock/light lock/heavy lock lock is healthier. How is locking and unlocking accomplished?
- Oracle temporary table space role
- PHP 操作mangoDb
- Pytorch Deep Learning Quick Start Tutorial -- Mound Tutorial Notes (3)
- shell脚本实例
- 深度学习21天——卷积神经网络(CNN):服装图像分类(第3天)
猜你喜欢
随机推荐
阿里顶级架构师多年总结的JVM宝典,哪里不会查哪里!
CCVR eases heterogeneous federated learning based on classifier calibration
电竞、便捷、高效、安全,盘点OriginOS功能的关键词
汇编语言(8)x86内联汇编
Neuron Newsletter 2022-07|新增非 A11 驱动、即将支持 OPC DA
韦东山 数码相框 项目学习(六)tslib的移植
STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)
Custom filters and interceptors implement ThreadLocal thread closure
PAT Level B - B1021 Single Digit Statistics (15)
21 Days of Deep Learning - Convolutional Neural Networks (CNN): Clothing Image Classification (Day 3)
正则表达式replaceAll()方法具有什么功能呢?
无题十
How ali cloud storage database automatically to speed up the loading speed of www.cxsdkt.cn how to set up the case?
仿SBUS与串口数据固定转换
First Decentralized Heist?Loss of nearly 200 million US dollars: analysis of the attack on the cross-chain bridge Nomad
mysql进阶(二十七)数据库索引原理
MySQL advanced (twenty-seven) database index principle
shell脚本实例
蚁剑webshell动态加密连接分析与实践
Egg framework usage (1)









