c++openframeworks

Delay function makes openFrameworks window freeze until specified time passes


I have network of vertices and I want to change their color every second. I tried using Sleep() function and currently using different delay function but both give same result - lets say I want to color 10 vertices red with 1 second pause. When Im starting project it seems like the window freezes for 10 seconds and then shows every vertice already with red color.

This is my update function.

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

Here is draw function

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);
}

This is my delay() function

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)
        ;
}

Solution

  • // .h
    float nextEventSeconds = 0;
    
    // .cpp
    void ofApp::draw(){
        float now = ofGetElapsedTimef();
        if(now > nextEventSeconds) {
            // do something here that should only happen
            // every 3 seconds
            nextEventSeconds = now + 3;
        }
    }
    

    Following this example I managed to solve my problem.