做一个工控软件,需(高速)同步接收单片机发过来的数据,并从第一个数据到达开始记录每一帧数据的接收时间。
现发现计时不准,请高人指教。试了一下,C# 中计时可使用三种方法,直接上代码了——
[DllImport("KERNEL32.dll", CharSet = CharSet.Auto, EntryPoint = "GetTickCount")]
        public static extern long GetTickCount();        private void button6_Click(object sender, EventArgs e)
        {
            long StartTime = GetTickCount();
            System.Threading.Thread.Sleep(567);
            long Time = GetTickCount() - StartTime;
            Console.WriteLine("GetTickCount===========" + Time.ToString());
            Application.DoEvents();            StartTime = DateTime.Now.Ticks;
            System.Threading.Thread.Sleep(567);
            Time = DateTime.Now.Ticks - StartTime;
            float Ftime = (float)Time / 10000f;   //To millisecond
            Console.WriteLine("DateTime.Ticks===========" + Ftime.ToString());
            Application.DoEvents();            StartTime = DateTime.Now.Millisecond + DateTime.Now.Second * 1000 + DateTime.Now.Minute * 60000 + DateTime.Now.Hour * 1440000;
            System.Threading.Thread.Sleep(567);
            Time = DateTime.Now.Millisecond + DateTime.Now.Second * 1000 + DateTime.Now.Minute * 60000 + DateTime.Now.Hour * 1440000 - StartTime;
            this.Text = Time.ToString();
            Console.WriteLine("DateTime.Millisecond===========" + Time.ToString());
        }第一个方法使用API函数GetTickCount,这个函数在VB6里面很好用,但到C#中却乱了。
第二个办法使用DateTime的Tick属性,此值为毫秒的万分之一。
第三个办法使用DateTime的Millisecond属性,考虑到程序运行中可能垮秒、垮分钟、垮小时等问题,故将时分秒皆转为毫秒来计算。
问题是这三个方法都不行,时间不准——请看运行效果:初次运行
GetTickCount===========8589935154
DateTime.Ticks===========562.5
DateTime.Millisecond===========578
第二次
GetTickCount===========8589935155
DateTime.Ticks===========562.5
DateTime.Millisecond===========579
程序没动,数值有变化,难道一分钟之内,电脑运行也会时快时慢?
再来
GetTickCount===========12884902466
DateTime.Ticks===========562.5
DateTime.Millisecond===========563
第四次
GetTickCount===========8589935154
DateTime.Ticks===========578.125
DateTime.Millisecond===========563
再跑一次吧,纠结中……
GetTickCount===========12884902451
DateTime.Ticks===========562.5
DateTime.Millisecond===========578
难道是Thread.Sleep不准?
再看:
Stopwatch Sw = Stopwatch();            Sw.Start();
            System.Threading.Thread.Sleep(1700);
            Sw.Stop();
            Console.WriteLine("==========={0}", Sw.Elapsed.Milliseconds.ToString());输出结果:===========699
运行多次的结果都一样。郁闷!