2014-10-15 1 views
0

사용자 반응 시간을 측정하려고합니다. 내 코드는 다음과 같다 :측정 시간 차이를 줄이기 위해 시간 퀀텀을 단축하는 방법은 무엇입니까?

int clocks2ms(clock_t range) { 
    return (int)((double)range*1000/CLOCKS_PER_SEC); 
} 

clock_t start = clock(); // start measuring 
while(!kbhit()); // wait for keypress 
int reaction = clocks2ms(clock()-start); // measure reaction 

반응 시간은 186ms이다 (+ -1ms), 201ms, 216ms 등 때문에 동일 15ms의 갭이있다. 간격을 줄이는 방법이 있습니까? 실시간 우선 순위로 실행하려고했습니다.

start "test" /Realtime "test.exe" 

아무 것도 변경되지 않았습니다. 나는 1ms의 정확성을 얻고 싶다.

답변

3

당신은 GetPerformanceCounter() (ref)와 같은 높은 정밀도로 타이머를 사용해야합니다 : 나는 위의 예제 코드에서 Query... 기능 오류 검사를 생략 한

LARGE_INTEGER StartCounter; 
LARGE_INTEGER EndCounter; 
LARGE_INTEGER Frequency; 

QueryPerformanceCounter(&StartCounter); 
QueryPerformanceFrequency(&Frequency); 

// Do stuff... 

QueryPerformanceCounter(&EndCounter); 

double TimeDelta = (EndCounter.QuadPart - StartCounter.QuadPart)/(double) Frequency.QuadPart; 

참고. kbhit()의 시간 해상도가 문제가 여기 있으면

1

, 다음 몇 가지 대안은 시도 할 수 있습니다 다음 kbhit() 기능이 실제로 deprecated 때문에

  1. , 당신은 대신 _kbhit() 기능을 사용하여 더 나은 결과를 얻을 수 있습니다 .

  2. ncurses으로 프로젝트를 컴파일 할 수있는 경우 반환 키를 기다리지 않고 문자를 가져 오는 getch() 함수가 있습니다.

  3. This question at the C FAQ은 더 나은 결과를 줄 수있는 콘솔에서 문자를 가져 오는 몇 가지 다른 방법을 나열합니다.

2

2 더 정확한 답변을 얻으려면 접근하십시오.

시작을 동기화하십시오. 어딘가에서 시계 틱내로을 시작하기보다는 변경 직후에 시작하십시오. 이것은 일반적으로 시작의 "지터"를 줄입니다. 이 아이디어는 2의 더 낫다 - 더 정확한 응답을 얻지 않으며 그러나 정확도를 개량하지 않는다.

clock_t prestart = clock(); 
clock_t start,end; 
while((start = clock()) == prestart); // 
puts("Hit Any Key"); 
fflush(stdout); 
while(!kbhit()); // wait for keypress 
end = clock(); 
int reaction = clocks2ms(end-start); 

끝 샘플 이후의 시계 사이클. 이것은 잠재적으로 정밀도를 향상 시키지만 시스템의 안정성에 달려 있습니다. 즉 다른 처리가 얼마나 진행되고 있는지에 달려 있습니다.

unsigned count = 0; 
... 
while(!kbhit()); // wait for keypress 
end = clock(); 
while(end == clock()) count++; 
int reaction = clocks2ms(end + (max_cnt_per_tck-count)/max_cnt_per_tck - start); 

당연히이 두 가지 방법 중 어느 것도 @uesp에서 제안하는 것보다 더 정밀도가 높은 시계에 액세스하는 것보다 낫지 않습니다. 그들은 시간의 불일치 또는이 스레드의 코드간에 발생할 수있는 인터럽트와 같은 시스템의 실시간 측면을 겪고 있습니다. 그러나 더 정확한 시간 원본을 사용할 수없는 경우 약간의 개선점을 제공합니다.