개발자들이 시간 측정의 용도로 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() 사용하는 것도 고려해야할 것이다.