如何通过使用sleep()或其他方法使代码执行缓慢

How to make your code execute slowly by using sleep() or something else?

本文关键字:方法 其他 代码 执行 缓慢 何通过 sleep      更新时间:2023-10-16

我试图使一些形状每0.5秒旋转一次,同时显示它的整个时间,而使用循环,然而,它只显示最终结果。我怎样才能使它不断地显示变化的图像?

我有:

for (float i = 190.0; i <= 200; i+= 2.0){
    viewMatrix = glm::lookAt(
        glm::vec3(i, 70.0f, 200.0f),  // eye position
        glm::vec3(0),                   // look at position
        glm::vec3(0.0f, 1.0f, 0.0f)); // up vect0r
    std::this_thread::sleep_for(std::chrono::milliseconds(500));//problem here
    glutPostRedisplay();

}

你已经得到了3个答案。他们每个人都完全错过了真正的问题(我在每个答案上都加了同样的评论):

你的问题是'glutPostRedisplay '没有积极显示任何东西。它所做的只是设置一些标志,在事件循环的下一次迭代时,将调用显示函数调用。例如:

bool do_display = false;
void glutPostRedisplay()
{
    do_display = true;
}
void glutMainLoop()
{
    while(running) {
    ...
    if( do_display ) call_display_callback();
    do_display = false; 
    ...
    }
} 

设置do_display标志,当然不会在循环中做任何事情,除了重复设置它。

你要做的是将idle函数本身作为循环体,并在那里增加循环变量。例如

float i = 190.0;
void anim_idle()
{
    if( i >= 200 ) { glutIdleFunc(NULL); }
    viewMatrix = glm::lookAt(
        glm::vec3(i, 70.0f, 200.0f),  // eye position
        glm::vec3(0),                   // look at position
        glm::vec3(0.0f, 1.0f, 0.0f)); // up vect0r
    glutPostRedisplay();
    i += 0.02;
}

也不应该在那里睡觉,这样程序才能保持交互。相反,度量迭代之间的时间间隔,并根据经过的时间间隔调整增量。

我不是一个OpenGL程序员,但我想有

glutPostRedisplay();

std::this_thread::sleep_for(std::chrono::milliseconds(500));
从我使用护士和窗口刷新的经验来看,

可能是问题的根源。

另外,我总是使用nanosleep来处理延迟

#include <time.h>
int msleep(unsigned long milisec)   
{   
    struct timespec req={0};   
    time_t sec=(int)(milisec/1000);   
    milisec=milisec-(sec*1000);   
    req.tv_sec=sec;   
    req.tv_nsec=milisec*1000000L;   
    while(nanosleep(&req,&req)==-1)   
        continue;   
    return 1;   
}   

要做你说的(不是基于你的例子),我会写这样的东西:

int main(){
    init();
    using Clock = std::chrono::high_resolution_clock;
    using std::chrono::duration_cast;
    using std::chrono::milliseconds;
    auto start = Clock::now();
    while(1){
        auto now = Clock::now();
        if(duration_cast<milliseconds>(now - start).count() >= 500){
            // do animation
            start = now;
        }
        swap_buffers();
    }
    finish();
}

不使用睡眠,只是一个繁忙的循环。

同样,使用float作为for循环计数器通常是不被允许的。

相关文章: