在vc线程的循环中,想要控制每步的循环时间,比如走一步1秒后再执行下一步循环,除了用sleep这个函数外还有什么别的方法没,先谢谢各位了。

解决方案 »

  1.   

    不用for,改为OnTimer.你想要每隔几秒执行一次就用SetTimer设定就可,然后在OnTimer执行for循环的任务
      

  2.   

    可以根据两次调用GetTickCount的返回值来确定经过了多少时间。
      

  3.   

    使用高精度多媒体时钟 
    QueryPerformanceFrequency QueryPerformanceCounter BOOL ret;
    LARGE_INTEGER Frequency;
    ret = QueryPerformanceFrequency(&Frequency);
    ASSERT(ret);
    LARGE_INTEGER Delay_Count;
    Delay_Count.QuadPart = Frequency.QuadPart / 10; //0.1秒 for(xxxxxxxx)
    {
    LARGE_INTEGER End_Count;
    ret = QueryPerformanceCounter(&End_Count);
    ASSERT(ret);
    End_Count.QuadPart += Delay_Count.QuadPart; //do something
    while(1) //等待延时
    {
    LARGE_INTEGER Cur_Count;
    ret = QueryPerformanceCounter(&Cur_Count);
    ASSERT(ret);
    if(Cur_Count.QuadPart > End_Count.QuadPart)
    break;
    Sleep(0);
    }
    }
      

  4.   

    Sleep、OnTimer 都只能大概性的控制,精度很差,但使用简单,线程不需要处理时间相关的附加任务,CPU不浪费;GetTickCount 返回开机到调用时的毫秒计数,可用于毫秒级的控制,但线程必须自己控制流程,如在一个循环中不停检查的话 CPU 会 100%,不可接受;要精确的话应该多媒体时间控制,据说可以使用多媒体时间控制方法,我自己没用过,不过个人对 zgl7903 的代码有点怀疑 -- 其 CPU 占用应该也会很高,在一个循环中放置一个 Sleep(0) 除了能让进程中其它中其它线程有运行机会外没什么别的用处。
      

  5.   

    我也只知道OnTimer和SetTimer             
      

  6.   


    timesetevent效果不错,之前用过。做的是MS级别的定时任务
      

  7.   

    由于Windows根本就不是实时操作系统,所以在Windows下更本没有办法精确实现你的目的,Sleep可能根本就不起作用,这是有线程优先级决定的,而OnTimer肯定也不行,因为它是消息模式,不是实时的,GetTickCount也不行.