thread.sleep(1)是最小单位了(即1秒的千分之一)?我需要程序暂停1秒的两千分之一咋办呀?

解决方案 »

  1.   

    网络上很多关于 Timer, Thread.Sleep 精度问题的讨论
    一般那来说,不会小于 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
      

  2.   


    经过测试..使用 thread.sleep(1):开50个线程两千次数据.理论上应该运行2秒.而实际运行了43秒...汗..这差距太大了!!! ...我不奢望两千分之一秒了..有没有办法真的暂停 千分之一秒呢?
      

  3.   

    我的看法,一般50ms一下的时间,开始和计算机硬件、系统、运行软件等关系大起来了。
    要进行毫秒级的时间延迟,在Windows下软件实现的可能性及稳定性不太大。
    推荐采用实时系统或者硬件定时。
      

  4.   

    thread.sleep(1)是最小单位了(即1秒的千分之一)?我需要程序暂停1秒的两千分之一咋办呀?呵呵,1秒的千分之一 ,你要这么精准用来干什么呢?!
      

  5.   

    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();
            }
        }
      

  6.   

    受到Window系統消息隊列時效性的影響(windows不是實時系統)
    即使使用 Environment.TickCount,精度仍舊達不到樓主的需求
    其實樓主是否真的有這需求?使用C#寫的程式,運行于Windows平臺上是否真的需要這么高的精度呢?
      

  7.   

    同意,Lost_Painting
    只要是windows平台上,普通pc,任何语言也达不到微妙级的控制!这种暂停几乎没有意义
    windows 支持的最高时间精度也就是ms
    要做到微妙级别,对硬件支持就有特殊要求。甚至不能由操作系统控制,理论上才能达到 
      

  8.   

    可以用Thread.SpinWait, 它是让处理器空转等待,所以等待时间和处理器的指令时长有关,可以达到很高的时间精度,至于一次迭代到底花费多少微秒因为每台机器的结果都不一定相同需要你自行测试下。
      

  9.   


    是的,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判断也要时间也会有误差
      

  10.   

     TimeSpan.FromTicks
    //设置时间刻度,不过你的突发奇想很爆炸
      

  11.   

    呵呵..60个线程.我是把sleep(1)用在多线程方法里面..如果不使用sleep(1),多线程过程不到1秒就结束了.而使用了sleep(1).要至少5秒....所以同我想的有些差距呢