如何通过使用sleep()或其他方法使代码执行缓慢
How to make your code execute slowly by using sleep() or something else?
我试图使一些形状每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
循环计数器通常是不被允许的。
相关文章:
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- GlobalAlloc而不是其他分配方法
- 让bool方法返回其他整数
- 还有其他方法可以在数组中写入多维数组吗?
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- Unity3d 中还有其他方法可以访问设备相机吗?
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- Sizeof返回的是指针大小,而不是数组大小.有其他方法可以找到尺寸吗
- 继承构造函数和其他变量的解决方法
- 还有其他方法可以为乘法表编写循环以获取运行时值吗?
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 如何使 extern 方法在共享库中定义,但使用 cmake 在其他目标中声明?
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- 是否有其他方法将.dll文件从一个项目复制到我的启动项目中的可执行文件旁边
- 将指针类方法作为参数传递给其他类方法C
- 如何为其他类成员函数编写模板包装方法
- std::d eclare_if 或其他在编译时丢弃成员声明的假设方法
- 当从其他方法返回 vector 时,C++无法访问矢量元素
- 我不允许更改变量的声明,我可以编辑哪些其他方法
- 如何使用Python脚本或其他一些方法来美化所有文件