做一个工控软件,需(高速)同步接收单片机发过来的数据,并从第一个数据到达开始记录每一帧数据的接收时间。
现发现计时不准,请高人指教。试了一下,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
运行多次的结果都一样。郁闷!
现发现计时不准,请高人指教。试了一下,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
运行多次的结果都一样。郁闷!
解决方案 »
- C#编辑框控件扩展的问题~~~~送分贴
- double转string的问题
- wpf中的datagird控件如何绑定datatable?
- 多线程调用共用方法的问题
- 有特别懂线程的高手吗????请教你一个难题啊!!!
- 向已获得句柄的窗口中的编辑框发送消息遇到的问题
- 复制一段网页内容(包括图片,链接等),用什么方法可以在winform里面把复制的内容粘贴过来呢?(就像word一样)
- 失恋了。。。散分。。。
- 请教简单问题,在线等:在C#+Oracle开发过程中,如何用“事务”?最好有代码,多谢。
- 新手提问,请问正则表达式Regex在哪个命名空间下面啊?
- 扩展控件能够获得焦点的问题
- C#如何实现在图片上画个文本框动态写字的功能
试试
http://msdn.microsoft.com/zh-cn/library/system.diagnostics.stopwatch(v=VS.80).aspx
System.Threading.Thread.Sleep(567);