c++ - 延迟函数使 openFrameworks 窗口卡住,直到指定的时间过去

标签 c++ openframeworks

我有顶点网络,我想每秒更改它们的颜色。我尝试使用 Sleep() 函数并且当前使用不同的延迟函数但两者都给出相同的结果 - 可以说我想用 1 秒的暂停将 10 个顶点着色为红色。当我开始项目时,窗口似乎卡住了 10 秒,然后显示每个顶点都已显示为红色。

这是我的更新函数。

void ofApp::update(){
    for (int i = 0; i < vertices.size(); i++) {
        ofColor red(255, 0, 0);
        vertices[i].setColor(red);
        delay(1);
    }
}

绘制函数

void ofApp::draw(){
    for (int i = 0; i < vertices.size(); i++) {
        for (int j = 0; j < G[i].size(); j++) {
            ofDrawLine(vertices[i].getX(), vertices[i].getY(), vertices[G[i][j]].getX(), vertices[G[i][j]].getY());
        }
        vertices[i].drawBFS();
    }
}

    void vertice::drawBFS() {
    ofNoFill();
    ofSetColor(_color);
    ofDrawCircle(_x, _y, 20);
    ofDrawBitmapString(_id, _x - 3, _y + 3);
    ofColor black(0, 0, 0);
    ofSetColor(black);
}

这是我的 delay() 函数

void ofApp::delay(int number_of_seconds) {
    // Converting time into milli_seconds 
    int milli_seconds = 1000 * number_of_seconds;

    // Stroing start time 
    clock_t start_time = clock();

    // looping till required time is not acheived 
    while (clock() < start_time + milli_seconds)
        ;
}

最佳答案

您的代码中没有错误,只是对等待的误解。所以这不是确定的答案,只是正确方向的提示。

您可能只有一个线程。一个线程一次只能做一件事。当您调用 delay 时,这个线程所做的就是一遍又一遍地检查时间,直到某个时间过去。

在此期间线程不能做任何事情(它不能神奇地跳过指令或检测你的意图)。所以它不能发出绘图命令或交换一些缓冲区来在屏幕上显示 vector 。这就是您的应用程序似乎卡住的原因——99.9% 的时间它都在检查间隔是否已过。这也给 cpu 带来了沉重的负担。

解决方案可能有点棘手并且需要线程。通常你有一个 UI-Thread 定期绘制东西,刷新显示,可能接受输入等等。此线程永远不应进行繁重的计算以保持 UI 响应。然后,第二个线程将管理更繁重的计算或更新数据。

如果你想在一个时间间隔内运行一个任务,你不只是循环直到时间结束,而是实质上“告诉操作系统”第二个线程应该在一段时间内不活动。操作系统将以这种方式管理比实现主动等待更有效。

但这是一个很大的话题,所以我建议您继续阅读有关多线程的内容。 C++ 有一个 small thread library从 C++11 开始。可能值得一看。

关于c++ - 延迟函数使 openFrameworks 窗口卡住,直到指定的时间过去,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59051914/

相关文章:

c++ - CMake 和 pugixml

c++ - MOG2 背景扣除参数

c++ - 在圆圈周围放置一个 ofImage

iphone - 检测多个按钮被单击的最佳方法是什么

C++ 在元组中存储原始字符数组

c++ - 实时 QCustomPlot 的设置

C++ RNG (Mersenne Twister) 需要种子

video - FFmpeg - 将一个视频叠加到另一个视频上?

ios - 将双鱼眼视频转换为等距柱状

c++ - 如何使用 boost bcp?