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

摘要:
在场景中,当水库中的液位较低时,会给出语音广播提示和弹出提示。枚举类型KillPool代码:publicenumKillPool{////////液体储罐//////WaterTank=1,//////上部雾化池,因此将语音广播放在新线程中。//语音提示System.Threading.thread=newSystem.Threading.thread//已创建线程t Start();// 启动线程以循环播放音频文件,方法PlayWarnSound对应于新线程privatestaticvoidPlayWarnSound{Global.PublicVar.Instance.WarnPlayer.PlayLooping();//循环播放}。此音频文件是发出“嘟嘟”声的音频文件,音频文件来自网络。
场景

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

注:

博客主页:
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+@"DataMCProjectSoundwarn.wav");
            /// <summary>
            /// 警报播放器
            /// </summary>
            public System.Media.SoundPlayer WarnPlayer
            {
                get { return _warnPlayer; }
                set { _warnPlayer = value; }
            }

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

C#中实现简单的预警提示功能(语音提示与弹窗提示)第1张

然后进入其代码中

    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;
            }
        }

        #endregion

        public 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:
                        //将是否监控低液位置为false
                        Global.PublicVar.Instance.IsGoOnMonitorWaterPool = false;
                        //计时
                        Global.PublicVar.Instance.TimerWaterTank.Enabled = true;
                        break;
                    case KillPool.UpWuHuaPool:
                        //将是否监控低液位置为false
                        Global.PublicVar.Instance.IsGoOnMonitorUpWuHuaPool = false;
                        //计时
                        Global.PublicVar.Instance.TimerUpWuHuaPool.Enabled = true;
                        break;
                    case KillPool.DownWuHuaPool:
                        //将是否监控低液位置为false
                        Global.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#中实现简单的预警提示功能(语音提示与弹窗提示)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux命令发送Http的get或post请求(curl和wget两种方法)pytest框架(一)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

vs下调试程序时,把信息打印到输出窗口

重印:https://blog.csdn.net/cwj066/article/details/82423627 https://stackoverflow.com/questions/20508086/getting-rid-of-atltracegeneral-category-shown-in-atltrace-output方法1:编写一个变量参数函数...

ios 苹果和百度地图的相关使用

同时由于苹果使用的是高德,不会像谷歌地图一样在国内乌龟一样的访问速度,确实做一些地图相关的东西,非常有吸引力。只是实现了显示一个百度地图的view。百度地图使用的是Objective-C++,这意味这必须要有一个.mm文件。...

如何给LINUX红帽子版本配置IP(转)

如果需要绑定另一个IP地址,只需在文件名中添加一个,并在文件中的DEVICE中添加eth0:x。LINUX可以支持多达255个IP别名,多个网卡绑定到一个IP地址,并且可以使用多个网卡创建具有相同IP地址的虚拟网卡。事实上,这种技术已经存在于Sun和Cisco中,它们分别被称为中继和以太网信道技术。在Linux中,这种技术被称为绑定。...

【转】 中兴OLT-C300常用命令

在当前的C220版本中,ONU类型名称在GPON和EPON中应该是唯一的。这里我们使用“ZTEG-F620”。ZXAN#ponZXAN#onu-typegponZTEG-F620描述4ETH,2POTSZXAN#onu-ifZTEG-F620eth_0/1-4ZXAN#onon-ifZTEG-F620pots_0/1-2ZXAN#on u type attr...

GitLab的基础使用-创建用户(users)

否则,将追究法律责任。1、 以管理员身份登录GitLab的WebUI,并创建用户1˃使用管理员登录GitLab。管理员登录成功后,点击下图所示的小扳手,然后点击进入管理员的Dashboard界面。如果时间间隔过长,可以要求运维人员重置密码。操作和维护人员可以参考第一步来重置用户的密码。实际上,您也可以通过参考第三步中的方法找到自己的密码,而不必麻烦操作和维护...

在chrome浏览器中 页面生成二维码

流行信息的传播也在悄然变化。条形码逐渐成为一种时尚符号!QR码可以通过软件生成。如果您使用Chrome浏览器,通常需要在网页上生成QRCode。在Chrome浏览器的书签选项中添加网页。(可选)我称之为QR码URL:vars=document。createElement('script');...