关于静态窗体定时器的线程运行

文章讨论了在窗体中使用静态窗体定时器查询设备状态时遇到的问题,即每次生成新窗体时,定时器未被正确释放,导致后续窗体的控件使能无法更新。作者分析了问题原因并提出了三种解决方案:1) 隐藏窗体而非关闭;2) 将静态定时器改为非静态;3) 在生成新窗体时检查定时器状态并重新生成。
摘要由CSDN通过智能技术生成

最近遇到一个问题,在窗体中定义了一个静态的窗体定时器,用来查询设备的启动状态,当设备启动后,自动更新软件控件的使能,但是也是由于这个静态的定时器,导致了问题的存在。
每次更改设备时,都会重新生成一个窗体
 // 增加设备信息窗口      
        private void btnToolSysDevInfo_Click(object sender, EventArgs e)
        {
            List<string> timerrunning;
            //CTimerManagement CTimer = new CTimerManagement();
            timerrunning = timerManager.GetEnabledTimers();
            if (((timerrunning.Count == 1) && (timerrunning.Contains(CGlobalValue.CONST_STR_TIMER_IQUIRE_STATE))) || (timerrunning.Count == 0))
            {
                frmInfo mInfo = new frmInfo(this);//生成新的窗体
                mInfo.StartPosition = this.StartPosition;
                mInfo.ShowDialog(this);
            }
            else
            {
                MessageBoxEx.Show(this, Properties.Resource.STR_CLOSE_MEASURE_BEFORE_USE);
            }
        }

我在frmInfo中定义了


        /// <summary>
        /// 查询灯状态信息的定时器
        /// </summary>
        private static System.Windows.Forms.Timer m_QryTimer;


并且实例化了定时器事件:


 /// <summary>
        /// 查询灯状态定时器处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void m_QryTimer_Tick(object sender, EventArgs e)
        {
            try
            {
                //执行查询动作
                QueryLampStatus();

                //氘灯钨灯控制都已经结束,则应该停止定时器
                if ((m_bD2Ctrl == false) && (m_bWCtrl == false))
                {
                    //停止定时器
                    m_QryTimer.Stop();
                }

                m_s32TimerTickCnt++;

                if (m_s32TimerTickCnt >= QRY_LAMP_STATUS_TRY_CNT)
                {
           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值