C ++에서 30ms의 경과 시간 후 루프에서 나가는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/946167

  •  09-09-2019
  •  | 
  •  

문제

C ++에서 가능한 한 30ms에 가까운 루프에서 나가는 가장 좋은 방법은 무엇입니까? 폴링 부스트 : microsec_clock? Qtime 투표? 다른 것?

같은 것 :

A = now;
for (blah; blah; blah) {
    Blah();
    if (now - A > 30000)
         break;
}

Linux, OS X 및 Windows에서 작동해야합니다.

루프의 계산은 시뮬레이션을 업데이트하기위한 것입니다. 30ms마다 뷰포트를 업데이트하고 싶습니다.

도움이 되었습니까?

해결책

이 링크의 코드 스 니펫 예제는 원하는 것을 거의 수행합니다.

http://www.cplusplus.com/reference/clibrary/ctime/clock/

그들의 예에서 적응 :

void runwait ( int seconds )
{
   clock_t endwait;
   endwait = clock () + seconds * CLOCKS_PER_SEC ;
   while (clock() < endwait)
   {
      /* Do stuff while waiting */
   }
}

다른 팁

루프의 계산은 시뮬레이션을 업데이트하기위한 것입니다. 30ms마다 뷰포트를 업데이트하고 싶습니다.

스레드 사용을 고려해 보셨습니까? 당신이 설명하는 것은 타이머 대신 스레드를 사용해야하는 이유에 대한 완벽한 예입니다.

기본 프로세스 스레드는 UI를 계속 처리하고 QTimer를 30ms로 설정하여 업데이트합니다. 잠금 a qmutex 데이터에 액세스하려면 업데이트를 수행하고 MUTEX를 출시합니다.

두 번째 스레드 (참조 Qthread) 시뮬레이션을 수행합니다. 각주기마다 qmutex를 잠그고, 계산을 수행하고 데이터가 안정적인 상태에있을 때 (UI 업데이트에 적합 함) MUTEX를 출시합니다.

멀티 코어 프로세서의 추세가 증가함에 따라 타이머 사용보다 스레드 사용에 대해 점점 더 생각해야합니다. 응용 프로그램은 새로운 프로세서의 증가 된 전력 (다중 코어)의 이점을 자동으로 이점을 얻습니다.

이것이 질문에 대답하지는 않지만 솔루션을 다시 볼 수 있습니다. 시뮬레이션 코드와 사용자 인터페이스를 다른 스레드에 배치하는 것은 어떻습니까? QT를 사용하는 경우 타이머 또는 심지어 주기적 업데이트를 실현할 수 있습니다. qthread :: msleep (). 당신은 그것을 조정할 수 있습니다 나사산 Mandelbrot 예제 당신의 필요에 맞게.

특정 시간이 경과 할 때까지 일을해야한다면 Docflabby의 대답 스팟 온입니다. 그러나 지정된 시간이 경과 할 때까지 기다릴 필요가 있다면 사용해야합니다. usleep()

짧은 대답은 일반적으로 할 수 없지만 올바른 OS 또는 오른쪽 하드웨어에서 실행중인 경우 가능합니다.

인텔 시스템의 어셈블리 호출과 다른 아키텍처에서 다른 OS를 사용하여 모든 OS에서 30ms에 가까워 질 수 있습니다. 참조를 파고 답을 편집하여 코드를 찾을 때 코드를 포함하겠습니다.

문제는 시간 슬라이싱 알고리즘과 멀티 태스킹 OS에있는 시간 슬라이스가 얼마나 가까운 지에 대한 것입니다.

일부 실시간 OS에는 시스템 라이브러리에 시스템 호출이있을 수 있지만 그 호출이 무엇인지 잘 모르겠습니다.

편집 : LOL! 누군가 이미 SO에 Similiar Snippet을 게시했습니다. C ++를 사용하여 나노 초에서 시간을 제공하는 타이머 기능

VONC는 CPU 타이머 어셈블리 코드와 함께 의견을 받았습니다.

귀하의 질문에 따르면, 30ms마다 뷰포트를 업데이트하고 싶습니다. 나는 비슷한 물건을 위해 500ms마다 하드웨어를 조사한 비슷한 앱을 썼습니다. 이것은 귀하의 질문에 직접 답변하지 않지만 다음과 같은 후속 조치가 있습니다.

  • 뷰포트를 업데이트하기 위해 Blah ()가 모든 인스턴스에서 30ms 미만으로 실행할 수 있습니까?
  • 타이머 콜백으로 Blah ()가 더 잘 수행되는 것처럼 보입니다.
  • 30ms 간격을 눌러 그래픽 프레임 워크에서 업데이트를 수행하는 라이브러리 타이머 개체를 찾기가 매우 어렵습니다. Windows XP에서 타이머 간격 만료시 2GHz P4에서도 창 메시지를 푸시하는 표준 WIN32 API 타이머는 타이밍 간격을 얼마나 낮게 설정하더라도 300ms 간격보다 더 빨리 업데이트 할 수 없다는 것을 알았습니다. 시간제 노동자. Win32 API에는 고성능 타이머가 있었지만 위에서 언급 한 것과 같은 루프에서 IPC (업데이트 UI 위젯)를 수행 할 수 없다는 많은 제한 사항이 있습니다.
  • 기본적으로 업데이트는 업데이트가 발생하는 방법을 매우 신중하게 계획해야한다는 것입니다. 스레드를 사용하고 뷰포트를 업데이트하는 방법을 살펴 봐야 할 수도 있습니다.

생각해야 할 몇 가지. 내가 프로젝트에서 일했을 때 그들은 나를 놀라게했다. 이미 이러한 것들을 생각했다면 내 대답을 무시하십시오 : 0).

모든 k 밀리 초가 아닌 모든 N 시뮬레이션 단계를 업데이트하는 것을 고려할 수 있습니다. 이것이 심각한 상업용 앱이라면, 다른 곳에서 제안 된 멀티 스레드 경로로 가고 싶을 것입니다. 당신이 시뮬레이션하는 것이 무엇이든, 모든 N 단계는 단순하고 휴대가 가능하며, 계속하기에 충분할 수 있습니다.

QueryPerformanCecounter 및 QueryPerformanceFrequency를 참조하십시오

QT를 사용하는 경우 여기에 간단한 방법이 있습니다.

QTimer* t = new QTimer( parent ) ;
t->setInterval( 30 ) ; // in msec
t->setSingleShot( false ) ;
connect( t, SIGNAL( timeout() ), viewPort, SLOT( redraw() ) ) ;

지정해야합니다 viewPort 그리고 redraw(). 그런 다음 타이머를 시작하십시오 t->start().

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top