定时器
1、一共有三种
- System.Windows.Forms.Timer:这个就是窗体中直接拖拽的那个,定时不准确,且会卡主线程和主线程使用同一个线程
- 定义在System.Timers.Timer 这个和下面那个是多线程定时器,定时准确,不会卡主线程
- System.Threading.Timer
直接代码设置(System.Windows.Forms.Timer)
int i=0;
System.Timers.Timer DTimer;
DTimer = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为100毫秒;
DTimer.Elapsed += new System.Timers.ElapsedEventHandler(DataTimeHandle);//到达时间的时候执行事件;
DTimer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
DTimer.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
//定时去opencv读取图片 100ms执行一次
public void DataTimeHandle(object source, System.Timers.ElapsedEventArgs e)
{
try
{
DTimer.Enabled = false;//NI 暂停的意思吧 等这段代码执行完了再开启
if (this.IsHandleCreated)
{
this.Invoke((EventHandler)delegate
{
pictureBox7.Image = bitmap
});
}
DTimer.Enabled = true;
}
catch(Exception ee)
{
DTimer.Enabled = true;
Console.WriteLine("come in =="+ee.Message);
}
}
设置好走之前关闭
public TestSFR()
{
InitializeComponent();
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
DTimer.Enabled = false;
//BitmapRead.Release();
}
控制台上不知道为什么没有成功 在winform上下次试试看
直接添加一个(System.Windows.Forms.Timer)
创建并设置属性,如果enabled了就会一直循环执行 中断服务函数
代码中的位置
编辑中断服务函数
实验现象,每隔0.5s 多一个点 一直持续下去
遇到的一些问题
1、就是你在定时器里面增加一个while 循环
解决办法(线程也可以这样解决)虽然不是最优的,但是可以这样解决。
就是使用switch 然后 一个case执行(然后case++进入等待case) 一个case等待(到完成了就进入下面一个case 执行下面的代码)
Thread.Sleep(2000);
可以使用Thread.Sleep(2000);使线程休眠,这个时候拖动 界面会出现卡顿现象
我感觉定时器回调函数这个线程就是和主线程一个线程 所以里面休眠了会卡界面 因为如果要休眠要等待的话 还是直接用多线程比较好。
private void timer1_Tick(object sender, EventArgs e)
{
Debug.WriteLine( "进入定时器");
timer1.Enabled = false;
Thread.Sleep(2000);//使线程休眠
Debug.WriteLine("退出定时器");
timer1.Enabled = true;
}
计时
方法1:精度高
using System.Runtime.InteropServices;
[DllImport("winmm")]
static extern void timeBeginPeriod(int t);
[DllImport("winmm")]
static extern void timeEndPeriod(int t);
[DllImport("winmm")]
static extern uint timeGetTime();
timeBeginPeriod(1);
uint start = timeGetTime();
Thread.Sleep(2719);
MessageBox.Show((timeGetTime() - start).ToString()); //单位毫秒
timeEndPeriod(1);
方法2:精度低点,代码少
[System.Runtime.InteropServices.DllImport("kernel32")]
static extern uint GetTickCount();
uint s1 = GetTickCount();
Thread.Sleep(2719);
MessageBox.Show((GetTickCount() - s1).ToString()); //单位毫秒