본문 바로가기
프로그래밍/C & C++

원하는 시간(ms)이 지났는지 확인하는 class

by 체리 2022. 3. 4.
반응형

class명을 어떻게 지어야 하는지 몰라 그냥 TimeInterval로 지었음

정확하게 interval마다 무언가를 하는 것이 아니라.. interval 이상 지난 후 내가 뭘 해야 할 때 씀

처음 생성시 시간을 넣어주고 CheckInterval()을 계속 호출하면 생성시 넣어준 interval이 지나면 true를 return함

 

먼저 결과는..

# g++ time_interval.cpp -lgtest -lgtest_main -lpthread
# ./a.out 
Running main() from gtest_main.cc
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from TimeInterval
[ RUN      ] TimeInterval.GetTimeInterval
[       OK ] TimeInterval.GetTimeInterval (0 ms)
[ RUN      ] TimeInterval.IsExceedTimeInterval
[       OK ] TimeInterval.IsExceedTimeInterval (301 ms)
[----------] 2 tests from TimeInterval (301 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (302 ms total)
[  PASSED  ] 2 tests.

 

code는 요럼

#include <iostream>
#include <chrono>
#include <unistd.h>
#include "gtest/gtest.h"

using namespace std;

class TimeInterval
{
public:
    TimeInterval(void) = delete;
    explicit TimeInterval(const size_t intervalInMilliseconds)
    : lastTime_(std::chrono::steady_clock::now()),
      intervalInMilliseconds_(intervalInMilliseconds)
    {
    }
    virtual ~TimeInterval(void)
    {
    }
    virtual size_t GetInterval(void) const
    {
        return intervalInMilliseconds_;
    }
    virtual bool CheckInterval(void)
    {
        std::chrono::steady_clock::time_point currentTime = std::chrono::steady_clock::now();
        auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - lastTime_).count();

        if (elapsedTime >= intervalInMilliseconds_)
        {
            lastTime_ = currentTime;
            return true;
        }

        return false;
    }

private:
    std::chrono::steady_clock::time_point lastTime_;
    const size_t intervalInMilliseconds_;
};

TEST(TimeInterval, GetTimeInterval)
{
    size_t TIME_INTERVAL_IN_MILLISECONDS = 200; // 0.2s
    TimeInterval interval(TIME_INTERVAL_IN_MILLISECONDS);

    EXPECT_EQ(TIME_INTERVAL_IN_MILLISECONDS, interval.GetInterval());
}

TEST(TimeInterval, IsExceedTimeInterval)
{
    size_t TIME_INTERVAL_IN_MILLISECONDS = 200; // 0.2s
    TimeInterval interval(TIME_INTERVAL_IN_MILLISECONDS);

    EXPECT_FALSE(interval.CheckInterval());
    usleep(100000);
    EXPECT_FALSE(interval.CheckInterval());
    usleep(200000);
    EXPECT_TRUE(interval.CheckInterval());
    EXPECT_FALSE(interval.CheckInterval());
}
반응형

'프로그래밍 > C & C++' 카테고리의 다른 글

rocksdb sample code on ubuntu 18.04  (0) 2022.02.27
fifo cache의 변형  (0) 2022.02.01
ubuntu에 google test (gtest) 설치 후 간단히 test  (0) 2022.02.01
boost를 이용한 crc 계산  (0) 2022.01.31

댓글