반응형

 

개발자들이 시간 측정의 용도로 GetTickCount()를 애용하고 있다.

 

정밀도 높은 시간 측정은 아니지만 편리한 맛에 많이 사용되고 있다.

 

GetTickCount() 함수를 간단하게 설명하자면, 이 함수는 윈도우즈가 부팅된 이후부터 시간이 카운팅되는 함수이며

 

수치는 1ms 단위로 카운팅된다. 즉, 윈도우즈 부팅 후 1초가 지났다면 반환 값은 1000이 된다.

 

하지만 이 함수는 한계가 있는데 바로 반환 시간이 최대 DWORD(32비트)라는 것이다.

 

날짜로 따지면 49.7일인데, 49.7일 동안 윈도우즈를 종료하지 않을 경우 0으로 초기화되는 것이다.

 

unsigned long Timer = GetTickCount();

while(true)
{
	if(GetTickCount() >= Timer + 1000) //1초가 지났는가?
	{
	    printf("1초 지남");
	    Timer = GetTickCount();
	}
}

위와 같은 코드가 있다고 하자.

 

1초에 한번씩 1초가 지났다는 메세지를 띄워주게 된다.

 

그런데 49.7일이 거의 다 된 상태에서 만약 "1초 지남"을 프린트하고 Timer 변수를 갱신한 뒤에,

 

49.7일이 지나 GetTickCount()가 0으로 초기화된다면?

 

즉, 예로 Timer = 10000이 들어간 상태에서 GetTickCount()가 0으로 초기화가 된다면

 

1초가 지날 때마다 조건을 만족해야함에도 불구하고 초기화로 인해서 10초를 더 기다려야 하는 상황이 발생한다.

 

49.7일 이전에 윈도우즈만 재부팅한다면 이런 것을 걱정할 필요는 없으나, 서버 등 계속 켜놓아야 하는 상황에서는

 

이런 상황이 발생할 수 있다.

 

그래서, 그 대안으로 GetTickCount64() 함수를 쓸 수 있다. 기존 GetTickCount()에서 범위만 커진 것이다.

 

64비트로 확장되었기 때문에, 5억년이 넘는다. 즉, 아무리 PC를 켜놓아아도 위와 같은 문제를 일으킬 일이 없다고 봐도 된다.

 

unsigned __int64 Timer = GetTickCount64();

while(true)
{
	if(GetTickCount64() >= Timer + 1000) //1초가 지났는가?
	{
	    printf("1초 지남");
	    Timer = GetTickCount64();
	}
}

이와 같이 변수 타입과 함수명만 바꾸어주면 되니 매우 간단하다.

 

결론적으로 GetTickCount()를 사용할 경우 상황에 따라, GetTickCount64() 사용하는 것도 고려해야할 것이다.

 

반응형

+ Recent posts