各位高手大家好,小弟请教以下一个问题:
  我用udp发送多媒体数据包,因为我所发送的包要做成视频,所以在线程中我每发送完一个包就要等待一段时间(ms级),我用的是sleep()来等待时间,但是我发现好像不是很精确,
比如所我计算出发完一个包后需要等待31ms,我用sleep(31)来等待,但是我不知道这个函数是否确切的等待了31ms,因为我在sleep前后用getTickCount()函数分别得出了一个时间值,这两个值相减是40ms
好像他多睡了好几毫秒,需要等待47毫秒的时候,减出来是50,一般都是整数我现在不知道是sleep()函数睡眠时间不够精确,还是我用getTickCount()函数计算出来的时间差不精确,不知道我上面的所清楚没有。呵呵。请问各位高手是否还有什么好的方法能“睡眠”精确的时间段,或是有什么建议。
先谢谢大家~!
预祝各位圣诞快乐^_^

解决方案 »

  1.   

    sleep()函数确实不是很准确。
    可以使用CPU的什么频率的函数计算精确的时间
      

  2.   

    void DelayUs(__int64 Us)
    {
        LARGE_INTEGER CurrTicks, TicksCount;     QueryPerformanceFrequency(&TicksCount);
        QueryPerformanceCounter(&CurrTicks);     TicksCount.QuadPart = TicksCount.QuadPart * Us / 1000000i64;
        TicksCount.QuadPart += CurrTicks.QuadPart;     while(CurrTicks.QuadPart<TicksCount.QuadPart)
            QueryPerformanceCounter(&CurrTicks);
    }
    可以精确到微妙
      

  3.   

    我现在是已经明确知道需要等待多少个毫秒,问题是怎么样实现这样的延时,象sleep()函数那样等待一段时间,我现在就是不确定sleep()是否精确的等待了我需要等待的时间,或者有没有别的办法实现精确的延时(我不是问怎么样精确定时,而是怎么样精确延时)
      

  4.   

    SetThreadPriority(Sleep所在的线程句柄,THREAD_PRIORITY_TIME_CRITICAL);提高线程优先级可以提高Sleep及WaitForXXX函数的时间精度.
    更高精度可以使用ZwDelayExecution()
      

  5.   

    在上面给了你精确定时的方法,下面这样做:
    1.在需定时的开始处  
        LARGE_INTEGER CurrTicks, TicksCount;     QueryPerformanceFrequency(&TicksCount);
        QueryPerformanceCounter(&CurrTicks);     TicksCount.QuadPart = TicksCount.QuadPart * Us / 1000000i64;
        TicksCount.QuadPart += CurrTicks.QuadPart;     while(!CurrTicks.QuadPart<TicksCount.QuadPart)
            NullOperation(); //这是一个你自己自定义函数
        NullOperation(){
         __asm{
              nop
              nop
              nop
              }
        }这样可以吗,如果成功请给我发个短信。
      

  6.   

    据说QueryPerformanceCounter在双核CPU下不能用
      

  7.   

    狂晕.Sleep无非是阻塞当前线程,和定时有啥区别??
      

  8.   

    另外你看明白我给你的那段代码了吗?.......至于QueryPerformanceCounter不能用,可以用CharlesPrince() ( )说的那种嵌入汇编代码的方法试试