2012-03-19 3 views
0

리눅스 환경에서 타이머를 만들거나 C++에서 500ms를 측정하는 방법을 알아야합니다. 나는 gettimeofday를 사용하고 시간 구조를 사용하려고 시도했지만 밀리 초 동안 정확한 정밀도를 얻지 못했습니다. 내가하려고하는 일은 최대 500ms 동안 작업을 계속하는 것입니다. 500ms 후 다른 일이 발생합니다.C++ timer linux

+0

가능한 중복 [리눅스에서 현재 프로세서 시간을 검색하는 방법?] (http://stackoverflow.com/questions/3107121/ 현재 프로세서가있는 시간을 가져 오는 방법) – Shahbaz

답변

3

다음 가장 좋은 방법은이 표준 : 크로노 라이브러리를 사용하는

http://en.cppreference.com/w/cpp/chrono/duration

당신이 그것을 원하는 어떻게 수행 할 작업을 완전히 확실하지 않다 정확히 500ms를 기다려야합니까?

그렇게이 그

std::this_thread::sleep_for(std::chrono::milliseconds(500)); 

에 대한 당신은 평가시기 여부를 확인하기 위해 500 밀리 초 한 번 포인터를 얻어서 경과 할 때까지 작업을하고 확인하실 수 있습니다 - system_time : 지금은()입니다 이상은 500ms

//if you compiler supports it you can use auto 
std::chrono::system_clock::time_point start=std::chrono::system_clock::now(); 

while(start-std::chrono::system_clock::now() 
      < std::chrono::milliseconds(500)) 
{ 
    //do action 
} 

C++ 11이 없으면 부스트 크로노 라이브러리에서도 작동합니다. 이 방법의 장점은 리눅스 시간 함수를 사용하는 것과는 달리 이식성이 있다는 것입니다. 당신이 리눅스에 있기 때문에

+0

1. C++ 0x는 아직 실험 단계입니다. 2. CPU가 대기 기간 동안 묶여 있습니다. – YankeeWhiskey

+1

1). GCC에서 적어도 std :: chrono는 훌륭하게 작동합니다. 2). 잠자기 기능을 의미하는 경우 유휴 상태가됩니다. 예를 들어 나중에 예를 들자면 OP가 500ms가 경과 할 때까지 작업을 수행하려는 작업을 정확하게 수행합니다. 대기 기간이 무슨 뜻인지 알지 못합니다. – 111111

1

정확한 정밀도를 얻을 수없는 이유 또는 시도 할 때 어떤 일이 발생하는지에 대해서는 분명하지 않지만 gettimeofday에 문제가있는 경우 clock_gettime을 사용하는 것이 좋습니다. 자세한 내용은 man clock_gettime을 참조하십시오. 당신이 C++ (11)에 액세스 할 수있는 경우

1

, 당신은 몇 마이크로 초 기간 동안 프로세스의 잠을 드릴 것입니다 어느

int usleep(useconds_t usec); 

usleep 시스템 호출을 사용할 수 있습니다. 나는 이것이 올바른 완전히 확실하지 않다

+0

''nanosleep' 또는'poll '과 같은 멀티플렉싱 호출 (예 : 입력을 기다리는 경우) –

0
#include <chrono> 
#include <iostream> 
#include <future> 
#include <atomic> 

void keep_busy(std::chrono::milliseconds this_long,std::atomic<bool> *canceled) { 
    auto start = std::chrono::high_resolution_clock::now(); 
    while(std::chrono::high_resolution_clock::now() < start+this_long) { 
     std::cout << "work\n"; 
     std::this_thread::sleep_for(std::chrono::milliseconds(50)); 
     if(canceled->load()) { 
      std::cout << "canceling op\n"; 
      throw "operation canceled"; 
     } 
    } 
} 

int main() { 
    std::atomic<bool> canceled(false); 
    auto future = std::async(std::launch::async, 
     keep_busy,std::chrono::milliseconds(600),&canceled); 
    std::this_thread::sleep_for(std::chrono::milliseconds(500)); 
    canceled.store(true); 
    try { 
     future.get(); 
     std::cout << "operation succeded\n"; 
    } catch(char const *e) { 
     std::cout << "operation failed due to: " << e << '\n'; 
    } 
} 

...의