void MyDisplay(void)
{
.......
}
void Timer1(int Value)
{
glutTimerFunc(25, Timer1, 0);
glutPostRedisplay();
}
void Timer2(int Value)
{
glutTimerFunc(10, Timer2, 0);
.........
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
....
glutDisplayFunc(MyDisplay);
glutTimerFunc(25, Timer1, 0);
glutTimerFunc(10, Timer2, 0);
....
}
대충 이런 구조의 코드로
일종의 짧은 3D애니메이션 프로그램인이고
일단 동작은 제대로 하고 있어요
근데 MyDisplay가 대충 4~5ms 정도 소모하고,
Timer2 는 1ms 이하 소모하고 있는데,
나는 Timer2 가 10ms 마다 호출되길 원하는데 실제로 돌려보면 간헐적으로 12~14ms 간격으로 호출되요.
아무래도 10ms가 지나도 MyDisplay 실행중이면 이거 끝날때까지 밀리는거 같은데, 아마 반대의 경우도 마찬가지 일거 같은데 Timer2 짧아서 그건 잘 보이지 않는거 같아요.
그런데 나는 Timer2 가 무조건 10ms 마다 실행되길 원하는데 어떤식으로 코드를 수정해야 하나요?
타임스탬프를 제대로 읽어야지.
쓰레드를 하나 더 만드세여
예시를 코드로 대충 보여줄게.
친절클라스ㄷㄷ...
아 젤 위에서 예약하는구조구나. 그냥 머견공대생 말처럼 쓰레딩 하면 된다.
친절해지려다 급 귀찮아짐. ㅋ
음 쓰레드로 해결봐야 하는건가.. 두분다 고맙습니다
이건 타이머 특성 때문인데
glut 쪽 타이머가 좀 그럼. 만약 니가 쓰레드를 두 개 생성해서 그 처리함수 안에서 코드를 순환시킨다면, 타이머 예약구조가 아니라 기본적으론 sleep 구조가 되거든,
그렇게 할거면 타임스탬프를 제대로 읽어서 처리해야함.
루프 안에서 현재시각을 읽어서 목표시각 크기만큼 sleep 하는 구조로 말야.
그렇다해도 보통 정밀하게 떨어지진 않지. Windows 가 RTOS 는 아니니까.
보다 더 정밀하게 돌리려면 약간 빨리 sleep 을 끝내고 spin 구조로 CPU 좀 쓰면서 돌린다든지,
별도의 타이머를 이용하는 방법을 써야함.
쉽게 접근하는 방법은 boost::asio 에서 제공해주는 서비스를 쓸 수도 있구, 고해상도 타이머 쪽으로 보면 정보가 널렸음.
뭔가 갈수록 내용이 어려워 지네요. 아무튼 참고할게요 고맙습니다.
되요->돼요 (되어 = 돼임) [리듬 맞춤법 봇♬]