2010-05-29 2 views
1

약 1 년 전에 전에 해보았던 것과 같이 이것은 정말로 짜증나는 일이며, 나 자신의 삶에서 어떤 라이브러리인지 기억할 수는 없습니다.C++의 특정 간격 속도로 메소드 호출하기

기본적으로 문제는 지정된 간격으로 특정 횟수만큼 또는 특정 기간 동안 메서드를 호출 할 수있게하려는 것입니다.

예를 들어, 지금부터는 "x"라는 메서드를 10 초에 0.5 초 간격으로 호출하고 싶습니다. 또는 5 초가 경과 할 때까지 지금부터 10 회까지 메소드 "x"를 호출하십시오.

이제이 기능을 향상 라이브러리로 사용한다고 생각했지만 지금은 찾지 못했고 약간 짜증이났습니다. 불행히도 나는 더 이상 코드를 소유하고 있지 않기 때문에 코드를 다시 볼 수는 없습니다.

또는 나는이 모든 것을 꿈꿔 왔을 수 있으며 독점 ​​코드 일 수있었습니다. 거기에 내가 무엇을하고 싶은지 아무것도없는 것으로 가정 할 때, 현재이 행동을 생산하는 가장 좋은 방법은 무엇입니까? 최대 1 밀리 초의 고해상도가 필요합니다.

실행되는 스레드를 차단하는지 여부는 중요하지 않습니다.

감사합니다.

+0

당신이하고있는 플랫폼 (또는 크로스 플랫폼입니까?)과 사용중인 컴파일러/표준 라이브러리/버전을 말할 수 있습니다. – sbi

+0

아, 역사가있는 개인 SCM 코드 저장소는 원하는 도구를 사용하여 여러 상황에서 매우 편리합니다. 수은, svn git 또는 다른 어떤 것을 좋아하십시오. – sbi

+0

죄송합니다, 현재 Unix/Linux 용으로 개발 중입니다. 이전 SCM 코드가없는 개인 SCM 코드 저장소를 사용합니다. 문제는 내가 그 회사에서 더 이상 일하지 않으며 내가 떠날 때 분명히 전체 코드 기반을 차지하지 않았다는 것입니다. 제안에 감사드립니다. – Aetius

답변

1

boost :: this_thread :: sleep과 boost :: datetime에서 발견되는 시간의 조합은?

1

자신의 질문에 대답하는 것은 좋지 않지만 Nikko가 제안한 두 가지 라이브러리에 기능을 구현하지 않았기 때문에 더 많은 것을 추가하고 싶습니다. 누군가는 이것을 어느 시점에서 유용 할 수 있습니다.

void SleepingExampleTest::sleepInterval(int frequency, int cycles, boost::function<void()> method) { 
    boost::posix_time::time_duration interval(boost::posix_time::microseconds(1000000/frequency)); 
    boost::posix_time::ptime timer = boost::posix_time::microsec_clock::local_time() + interval; 

    boost::this_thread::sleep(timer - boost::posix_time::microsec_clock::local_time()); 

    while(cycles--) { 
     method(); 

     timer = timer + interval; 
     boost::this_thread::sleep(timer - boost::posix_time::microsec_clock::local_time()); 
    } 
} 

희망을 갖고 사람들은 내가 작성한이 간단한 예를 이해할 수 있기를 바랍니다. 유연성을 허용하기 위해 바운드 기능을 사용합니다.

내 컴퓨터에서 약 50 마이크로 초의 정확도로 작동하는 것으로 보입니다. 메서드를 실행하는 데 걸리는 시간의 왜곡을 고려하기 전에 정확도는 몇 백 마이크로 초 였으므로 그만한 가치가 있습니다.

+0

어쩌면 존재하지 않았지만 실제로는 'sleep_until'을 선호하거나'sleep_for'를 사용하는 것이 더 현명합니다. 또한 일부 시스템에서는 비 모노톤 클록의 지속 시간에 산술 연산이 오버플로되어 버그가 발생하여이를 피할 수 있습니다. – sehe

+0

개념 증명 : [boost 사용] (http://coliru.stacked-crooked.com/a/53a9a15037ffa6f9) 및 [새로운 표준 라이브러리 기능 사용] (http://coliru.stacked-crooked.com/a/19ba9ca1c9babf62).주목할 점은 s/boost/std / – sehe

4

어쩌면 당신은 boost::asio에 대해 이야기하고 있습니다. 주로 네트워킹에 사용되지만 타이머 예약에 사용할 수 있습니다.

boost :: threads와 함께 사용할 수 있습니다.