场景

在储液罐液位偏低时会进行语音播报提示与弹窗提示。

注:

博客主页:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载

实现

首先在监控程序中循环读取是否低液位的信号,如果低液位时预警

WarningHelper.LowerLevelWarn("储液罐", KillPool.WaterTank);

调用预警的方法,因为这里有三个部件需要预警,所以设置了两个参数,一个是预警时提示的文本,一个是枚举类标识当前报警的部件是哪个。

枚举类KillPool代码:

     public enum KillPool{/// <summary>/// 储液罐/// </summary>WaterTank = 1,/// <summary>/// 上雾化池/// </summary>UpWuHuaPool = 2,/// <summary>/// 下雾化池/// </summary>DownWuHuaPool = 3}

然后在预警的工具类方法中

一部分是进行语音播报一部分是进行弹窗提示,因为这两项操作是同时进行的,所以为了防止语音播报卡住弹窗提示,所以将语音播报放在一个新线程中

//语音提示
System.Threading.Thread t = new System.Threading.Thread(PlayWarnSound);//创建了线程
t.Start();//开启线程

在新线程所对应的方法PlayWarnSound中

        private static void PlayWarnSound(object obj){Global.PublicVar.Instance.WarnPlayer.PlayLooping();//循环播放}

循环播报音频文件,此音频文件是发出“嘟嘟”声的音频文件,音频文件来源于网络。

然后这里使用的全局播放器对象进行播放这样可以在弹窗按钮的点击事件中进行停止播放。

在全局变量中定义全局播放器对象

            /// <summary>/// 警报播放器/// </summary>private System.Media.SoundPlayer _warnPlayer = new System.Media.SoundPlayer(System.Windows.Forms.Application.StartupPath+@"\Data\MCProject\Sound\warn.wav");/// <summary>/// 警报播放器/// </summary>public System.Media.SoundPlayer WarnPlayer{get { return _warnPlayer; }set { _warnPlayer = value; }}

语音播报后再弹出弹窗提示,首先新建一个Dialog窗体

然后进入其代码中

    public partial class LowLevelWarning : Form{#region  字段定义/// <summary>/// 报警的名称/// </summary>private string _warnComponentName;/// <summary>/// 报警的消杀池/// </summary>private KillPool _warnKillPool;#endregion#region  属性定义public KillPool WarnKillPool{get { return _warnKillPool; }set { _warnKillPool = value; }}public string WarnComponentName{get { return _warnComponentName; }set{_warnComponentName = value;this.lb_component.Text = value;}}#endregionpublic LowLevelWarning(){InitializeComponent();}private void bt_ok_Click(object sender, EventArgs e){//停止播放警报Global.PublicVar.Instance.WarnPlayer.Stop();this.DialogResult = System.Windows.Forms.DialogResult.OK;}

这样就能接受到传递过来的显示的提示文本以及标识当前预警是哪个部件

继续上面语音播报的同时弹窗提示的代码

            //弹窗提示LowLevelWarning lowLevelWarnDialog = new LowLevelWarning();lowLevelWarnDialog.WarnComponentName = warnComponentName;lowLevelWarnDialog.WarnKillPool = killPool;lowLevelWarnDialog.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;lowLevelWarnDialog.ShowDialog();

上面在窗体的按钮的点击事件中

停止播放音频文件并将当前Dialog的结果返回为OK

            //停止播放警报Global.PublicVar.Instance.WarnPlayer.Stop();this.DialogResult = System.Windows.Forms.DialogResult.OK;然后继续上面显示弹窗的代码后if (lowLevelWarnDialog.DialogResult == System.Windows.Forms.DialogResult.OK){switch (lowLevelWarnDialog.WarnKillPool){case KillPool.WaterTank://将是否监控低液位置为falseGlobal.PublicVar.Instance.IsGoOnMonitorWaterPool = false;//计时Global.PublicVar.Instance.TimerWaterTank.Enabled = true;break;case KillPool.UpWuHuaPool://将是否监控低液位置为falseGlobal.PublicVar.Instance.IsGoOnMonitorUpWuHuaPool = false;//计时Global.PublicVar.Instance.TimerUpWuHuaPool.Enabled = true;break;case KillPool.DownWuHuaPool://将是否监控低液位置为falseGlobal.PublicVar.Instance.IsGoOnMonitorDownWuHuaPool = false;//计时Global.PublicVar.Instance.TimeDownWuHuaPool.Enabled = true;break;}}

为了能实现停止监控程序中继续对报警的部件继续报警,所以根据当前的部件从而将全局的标识变量设置为false

同理在进行是否报警之前的代码就要根据这个全局变量来判断是否报警

//报警
if (Global.PublicVar.Instance.IsGoOnMonitorWaterPool){WarningHelper.LowerLevelWarn("储液罐", KillPool.WaterTank);}

上面开始计时器的代码

 Global.PublicVar.Instance.TimeDownWuHuaPool.Enabled = true;

是将计时器放在一个全局变量中

            /// <summary>/// 储液罐低液位收到报警到下一次报警倒计时/// </summary>private System.Timers.Timer _timerWaterTank = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为1000毫秒;  /// <summary>/// 储液罐低液位收到报警到下一次报警倒计时的计时器/// </summary>public System.Timers.Timer TimerWaterTank{get {_timerWaterTank.Elapsed += new System.Timers.ElapsedEventHandler(_timerWaterTank_Tick);//到达时间的时候执行事件;  _timerWaterTank.AutoReset = true;//设置是执行一次(false)还是一直执行(true);  return _timerWaterTank;}set { _timerWaterTank = value; }}/// <summary>/// 储液罐低液位收到报警到下一次报警倒计时执行事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void _timerWaterTank_Tick(object sender, EventArgs e){System.Timers.Timer timer = sender as System.Timers.Timer;this.LowLevelSecondsWaterTank--;if (this.LowLevelSecondsWaterTank <= 0){Global.PublicVar.Instance.IsGoOnMonitorWaterPool = true;timer.Enabled = false;this.LowLevelSecondsWaterTank = Global.LOW_LEVEL_MONITOR_SECONDS;}}

这样就能控制在首次报警后计时指定的事件再进行报警,因为监控程序是一直监控着的,不然就会一直嘟嘟的报警一直的弹窗。

C#中实现简单的预警提示功能(语音提示与弹窗提示)相关推荐

  1. 怎么在SAP MM库存管理中使用简单的货架管理功能

    摘要:SAP的WM或WMS提供了比较完整的立体货架管理功能,但是,很多的业务场景下,并不需要那么完整的解决方案,业务部门可能仅需要简单地记录一下物料存放的位置,以方便下次比较准确地知道货物存放在位置. ...

  2. electron 关闭窗口提示框 关闭确认 关闭弹窗 提示窗

    目的及效果: 点击窗口右上角的叉叉的时候,弹出下面这个,点击确认则程序结束,取消则提示框关闭,程序继续 , 环境:electron version: 11.0.4 main.js代码 var elec ...

  3. java培训教程分享:Java编写软件代码自动提示功能

    本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...

  4. [转]Android 代码自动提示功能

    源地址http://blog.sina.com.cn/s/blog_7dbac12501019mbh.html 或者http://blog.csdn.net/longvslove/article/de ...

  5. 怎样增强MyEclipse的代码自动提示功能

    转载自  怎样增强MyEclipse的代码自动提示功能 MyElipse的默认代码提示功能隐藏了许多细节,需要开发者手动设置,一起来设置吧,让你的myeclpse更强大 一般在Eclipse ,MyE ...

  6. Android 利用AutoCompleteTextView实现模糊搜索功能,搜索结果自动提示,识别拼音首字母并转汉字提示

    这里说一下怎么利用 Android 的 AutoCompleteTextView 控件实现模糊搜索功能,AutoCompleteTextView 自带自动提示功能.如果 对自动提示的布局自定义要求比较 ...

  7. WinForm中实现通用的弹窗提示框

    一.实现效果 二.核心脚本 /*** * Title:"数据采集" 项目 * 主题:弹窗 * Description: * 功能: * 1.弹窗提示 * 2.弹窗类型 * Date ...

  8. Eclipse输入Java和XML代码自动提示功能最简单的方法

    Eclipse输入Java和XML代码自动提示功能 1.设置 java 文件的代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > ...

  9. Eclipse for android 中设置java和xml代码提示功能(转)

    1.设置 java 文件的代码提示功能 打开 Eclipse 依次选择 Window > Preferences > Java > Editor - Content Assist & ...

最新文章

  1. 【转】C语言的memset函数
  2. 通过minify将项目中js和css文件的打包
  3. php 随机调用文章,zblog PHP调用热门文章、随机文章和热评文章代码
  4. 一条正确的Java职业生涯规划,从理论到实践!
  5. python dataframe loc函数_python pandas.DataFrame.loc函数使用详解
  6. uva 725 Division(暴力模拟)
  7. c语文编程提取郑码的单字码表
  8. SSD浅层网络_目标检测SSD
  9. AS3读取XML文档
  10. 给自己的网址加上https,添加ssl证书(springboot项目)
  11. eclipse配置项目部署到到本地tomcat
  12. java为table添加一行_Js实现Table动态添加一行的小例子
  13. linux基础(二)——linux各文件夹含义和作用
  14. 富勒wms系统里的定时器id_为什么物流行业非常推崇仓库管理系统?
  15. phpspider 简单用法和学习,分类一对多爬取数据
  16. torch.ones理解
  17. Leetcode 809. Expressive Words
  18. ThinkPad笔记本如何重装系统
  19. 【Markdown Pad 2常见问题3】Markdown Pad 2插入本土图片无法显示
  20. 股票python量化交易002-常见量化指标(技术面)

热门文章

  1. Hard Calculation 模拟(200)
  2. y2第一章 初始mybatis的上机3_MyBatis3.2.x从入门到精通之第一章
  3. 金融系统 mysql,mysql - 适用于CRM,CMS和其他金融系统的RDBMS与NoSQL [已结束]
  4. 虚拟机的分类_「面试必备」Java虚拟机知识点复习手册(下)
  5. iphone照片删掉又出现_iPhone 内存不够用,原因在这儿!
  6. netcore dapper mysql_.NET Core Dapper操作mysql数据库
  7. 11-Qt6 QByteArray字节数组类
  8. 已安装内存和可用内存不一致 4GB内存在win1064位系统中显示为可用 3.87GB解决办法
  9. 关于百度网盘限速第三方客户端的提醒
  10. 服务器错误重启mysql错误信息,mysql开启和使用事件、与服务器重启mysql错误