람다 콜백 , std::function<void()> 이용한 DelayCall

람다 , 콜백 관련글


http://scripter.co.kr/325

http://scripter.co.kr/326



std::function<void()> 를 이용하여

콜백 함수를 전역의 변수화 하여 다른 메서드에서 호출 하는 타이밍을 조절 한다.



#pragma once

ofxDelayCall.h


#include "ofEvents.h"
#include "ofUtils.h"
class ofxDelayCall
{

private:

    float interval = 0;
    float startTime = 0;
    std::function<void()> callback;

    

    void StartTimer();
    void StopTimer();
    void update(ofEventArgs &e);

public:
    ~ofxDelayCall();
    void DelayCall(float interval, std::function<void()> callback);
};





ofxDelayCall.cpp

#include "ofxDelayCall.h"


ofxDelayCall::~ofxDelayCall()
{
    cout << "delete call " << endl;
}

void ofxDelayCall::StartTimer()
{
    //타이머 시작
    ofAddListener(ofEvents().update,this, &ofxDelayCall::update);
}

void ofxDelayCall::StopTimer()
{
    //타이머 삭제
    ofRemoveListener(ofEvents().update, this, &ofxDelayCall::update);
}

void ofxDelayCall::update(ofEventArgs & e)
{
    float elapsed = ofGetElapsedTimef() - startTime;
    if (elapsed < 0.0001f) elapsed = 0;

    if (elapsed > interval)
    {
        cout << "callback!" << endl;
        callback();
        StopTimer();
    }
}

void ofxDelayCall::DelayCall(float interval, std::function<void()> callback)
{
    this->callback = callback;
    this->interval = interval;
    startTime = ofGetElapsedTimef();
    StartTimer();
}



활용 : 

cout << "delay start : " << std::this_thread::get_id() << endl; ofxDelayCall::DelayCall(1.5, [=]() { cout << "complete " << std::this_thread::get_id() << endl; });


Yamecoder 야매코더_
C++(oF) 2016. 1. 14. 14:54

댓글을 달아 주세요

Powerd by Tistory, designed by criuce
rss