public partial class Form1 : Form { public Form1() { InitializeComponent(); Thread T = new Thread(new ThreadStart(TimeSleepThread)); T.Priority = ThreadPriority.Highest; T.Start(); } delegate void TimeSleep(int Begin, int End); void TimeSleepThread() { int Start = Environment.TickCount; int Begin = Start; while (true) { int End = Environment.TickCount; if (End - Start > 1000 / 1000) this.Invoke(new TimeSleep(DoTimeSleep), new Object[] { Begin, End }); Start = Environment.TickCount; } } void DoTimeSleep(int Begin, int End) { this.Text = TimeSpan.FromMilliseconds(End - Begin).ToString(); } }
一般那来说,不会小于 10~15 ms(毫秒),楼主提及的 1/1000 秒 = 1毫秒,实际上是达不到的
更别说 暂停1秒的两千分之一了参考: http://bbs.bccn.net/thread-211272-1-7.htmlhttp://topic.csdn.net/u/20070403/14/2b05054d-68a7-4e7e-83de-ccd7a2c98a1b.html
经过测试..使用 thread.sleep(1):开50个线程两千次数据.理论上应该运行2秒.而实际运行了43秒...汗..这差距太大了!!! ...我不奢望两千分之一秒了..有没有办法真的暂停 千分之一秒呢?
要进行毫秒级的时间延迟,在Windows下软件实现的可能性及稳定性不太大。
推荐采用实时系统或者硬件定时。
{
public Form1()
{
InitializeComponent(); Thread T = new Thread(new ThreadStart(TimeSleepThread));
T.Priority = ThreadPriority.Highest;
T.Start();
} delegate void TimeSleep(int Begin, int End); void TimeSleepThread()
{
int Start = Environment.TickCount;
int Begin = Start; while (true)
{
int End = Environment.TickCount; if (End - Start > 1000 / 1000)
this.Invoke(new TimeSleep(DoTimeSleep), new Object[] { Begin, End });
Start = Environment.TickCount;
}
} void DoTimeSleep(int Begin, int End)
{
this.Text = TimeSpan.FromMilliseconds(End - Begin).ToString();
}
}
即使使用 Environment.TickCount,精度仍舊達不到樓主的需求
其實樓主是否真的有這需求?使用C#寫的程式,運行于Windows平臺上是否真的需要這么高的精度呢?
只要是windows平台上,普通pc,任何语言也达不到微妙级的控制!这种暂停几乎没有意义
windows 支持的最高时间精度也就是ms
要做到微妙级别,对硬件支持就有特殊要求。甚至不能由操作系统控制,理论上才能达到
是的,tick的精度大约是10多ms点,而timer的wm_timer消息更是只有50多ms的精度,
需要更高的精度需要用performanceCounter,vc里有个高精度计时器QueryPerformanceFrequency,
再高的话,有个汇编指令,可惜c#不支持内联汇编
vc里的写法
inline unsigned __int64 GetCycleCount()
{
__asm _emit 0x0F
__asm _emit 0x31
}
直接在cpu寄存器里操作,可以达到纳米级的效果不过精度越高的计时器,越敏感,你多执行一条语句,就会严重影响到精确度,所以高精度计时器只能告诉你已经经过了多久,而没法确定1毫秒触发一次,你一个if判断也要时间也会有误差
//设置时间刻度,不过你的突发奇想很爆炸