C#计时器调用函数执行时间大于定时器调用时间间隔

小白菜又菜 2014-07-24 05:10:11
我现在有一个WPF的程序,里面用定时器执行一个控制串口的函数。函数分两种情况执行,1.持续检测传感器值;2.在检测到串口的值为目标值时,执行一个运行时间为2s的程序(这个过程不用检测传感器的值)。
现在,如果我的定时器的时间间隔:如果设置太长,传感器的值就不好检测;如果设置太短定,时器上次建立的线程还没结束,就又开始执行定时器中的函数,请问大家有什么解决办法么?(最好改动不大)
代码如下:

void DtTick(object sender, EventArgs e)
{
Filling();
}

int Step = 0;//记录当前执行步骤
void fun1()
{
if ( Step == 1 && getState() )//检测传感器
Step = 2;
else { //执行对应代码
....
System.Threading.Thread.Sleep(2000);
Step = 1;
}
}
...全文
744 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
o249708193 2016-05-05
  • 打赏
  • 举报
回复
引用 4 楼 wike119 的回复:
[quote=引用 1 楼 rtdb 的回复:] 做事的时候禁止定时器,完成后恢复:

        private void Timer1_Tick(object sender, EventArgs e)
        {
                Timer1.Enabled = false;

                //do your things
 
                 Timer1.Enabled = true;
        }
这样是不行的,一旦Timer1.Enabled = false;后面的操作都不会执行了,因为定时器已经停掉[/quote] 有在执行啊。我就是这么做的
wike119 2014-10-26
  • 打赏
  • 举报
回复
引用 1 楼 rtdb 的回复:
做事的时候禁止定时器,完成后恢复:

        private void Timer1_Tick(object sender, EventArgs e)
        {
                Timer1.Enabled = false;

                //do your things
 
                 Timer1.Enabled = true;
        }
这样是不行的,一旦Timer1.Enabled = false;后面的操作都不会执行了,因为定时器已经停掉
小白菜又菜 2014-07-24
  • 打赏
  • 举报
回复
串口数据,需要自己每隔一段时间发送信号,然后读取,不会自己反馈。
bdmh 2014-07-24
  • 打赏
  • 举报
回复
串口不是有接收事件吗,干吗用timer检测值
rtdb 2014-07-24
  • 打赏
  • 举报
回复
做事的时候禁止定时器,完成后恢复:

        private void Timer1_Tick(object sender, EventArgs e)
        {
                Timer1.Enabled = false;

                //do your things
 
                 Timer1.Enabled = true;
        }
可以精确到1毫秒的定时器——多媒体定时器 主要用于数据采集。VB、VC 混合编程! 1、HighResolutionTimer 2、HL_mmTimer2 两者几乎一样,精度高,但都有个问题:一个进程中只能用一个此种控件! mmTimer_source.rar 是 mmTimer 控件的原版。 可以精确到1毫秒的定时器——多媒体定时器 ' *********************************************************************************** ' 功 能:可以精确到1毫秒的定时器——多媒体定时器 ' 特别注意:(一个工程中只能添加一个控件实例!第二个不执行,但不会导致程序崩溃!) ' 使用方法:方法一: ' 1、在窗体上添加此控件。 ' 2、调用函数 Init,设置时间间隔,并开启计时器! ' 3、在 Timer() 事件中添加执行代码。 ' 4、调用函数 Destroy,停止计时器。 ' 方法二: ' 1、在窗体上添加此控件。 ' 2、设置 Interval 属性。 ' 3、设置 Enabled 属性,开启或关闭计时器。 ' 4、在 Timer() 事件中添加执行代码。 ' 作 者:鹤望兰·流 ' 发布日期:2010-05-27 ' 网 站:http://hewanglan.ys168.com ' E - mail:hewanglan34512@163.com ' 依 赖:(HighResolutionTimer.ctx,HighResolutionTimer.dll,MhrtCallBack.bas) ' 更 新: ' * (******* 复制请保留以上信息 *******) ' ************************************************************************************** 本控件采用多媒体定时器包装而成,注意打包时带上"winmm.dll"。 为使VB6能用上它,用VC6封装出DLL,提供API接口,通过发送WM_KEYUP消息到VB6的用户控件触发计时事件! 超强Timer—— 用于需要对时间精确控制或者消息队列很忙的情况 http://blog.csdn.net/godwater8/archive/2007/04/10/1559458.aspx

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧