当前位置:网站首页>【温度预警程序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
边栏推荐
- Going to book tickets tomorrow, ready to go home~~
- Happens-before rules for threads
- Overall design and implementation of Kubernetes-based microservice project
- uniapp 连接ibeacon
- 2.4G无线收发模块的应用
- NowCoderTOP35-40——持续更新ing
- Open Source Summer | How OpenHarmony Query Device Type (eTS)
- dotnet OpenXML 解析 PPT 图表 面积图入门
- 仿SBUS与串口数据固定转换
- Oracle临时表空间作用
猜你喜欢
随机推荐
leetcode: 529. Minesweeper Game
express hot-reload
js 图形操作一(兼容pc、移动端实现 draggable属性 拖放效果)
[Unity] [UGUI] [Display text on the screen]
Egg framework usage (2)
5. Deploy the web project to the cloud server
Excuse me if you want to write data in mysql, with flink - connector - JDBC directly is ok, but I'm in the f
Open Source Summer | How OpenHarmony Query Device Type (eTS)
Handwriting Currying - toString Comprehension
如何实现按键的短按、长按检测?
IDEA执行Test操作导致数据插入时出现了重复数据
ECCV 2022 Oral Video Instance Segmentation New SOTA: SeqFormer & IDOL and CVPR 2022 Video Instance Segmentation Competition Champion Scheme...
PAT Class B-B1019 Digital Black Hole (20)
Advanced usage of C language
无题三
Tanabata romantic date without overtime, RPA robot helps you get the job done
2022.8.3
偏向锁/轻量锁/重级锁锁锁更健康,上锁解锁到底是怎么完成实现的
my journal link
公众号如何运维?公众号运维专业团队









