API Timer

IT/개발공부 / / 2020. 9. 12. 21:49
728x90
반응형

시간 정보 획득하기

SystemTimer, LocalTime

현재 시간을 구하려면 SYSTEMTIME 구조체와 아래의 2가지 함수를 사용합니다.

 

현재 지역 시간을 구합니다.

void GetLocalTime( LPSYSTEMTIME lpSystemTime )

 

세계 표준 시간(UTC)를 구합니다.

void GetSystemTime( LPSYSTEMTIME lpSystemTime )

 

또한 아래 함수들을 사용하면 SYSTEMTIME 구조체를 문자열로 반환 할 수 있습니다.

int GetTimeFormat( LCID Locale, DWORD dwFlags, CONST SYSTEMTIME *lpTime,
 LPCTSTR lpFormat, LPTSTR lpTimeStr, int cchTime );
 
int GetDateFormat( LCID Locale, DWORD dwFlags, CONST SYSTEMTIME *lpDate,
 LPCTSTR lpFormat, LPTSTR lpDateStr, int cchDate);

 

아래 예제는 현재 시간을 지역시간 혹은 세계표준 시간으로 얻어서 문자열로 출력해주는 예제입니다.

case WM_LBUTTONDOWN:
   {
      SYSTEMTIME st;
      GetSystemTime(&st);
      TCHAR buf[50];
      GetDateFormat(LOCALE_USER_DEFAULT, 0, &st, TEXT("yyy년 M월 d일"), buf, 50);
      SetWindowText(hwnd, buf);
      }
      return 0;

case WM_RBUTTONDOWN:
   {
      SYSTEMTIME st;
      GetLocalTime(&st);
      TCHAR buf[50];
      GetTimeFormat(LOCALE_USER_DEFAULT, 0, &st, TEXT("tt h시 m분 s초"), buf, 50);
      SetWindowText(hwnd, buf);
   }
   return 0;

마우스 왼쪽 버튼과 오른쪽 버튼을 클릭할 시 윈도우 텍스트를 변경합니다.

 

아래 함수들을 사용하면 지역을 표준 시간으로 또는 표준시간을 지역시간으로 변경할 수 있습니다.

BOOL SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION lpTimeZone,
    LPSYSTEMTIME lpUniversalTime, LPSYSTEMTIME lpLocalTime );
BOOL TzSpecificLocalTimeToSystemTime(LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
    LPSYSTEMTIME lpLocalTime, LPSYSTEMTIME lpUniversalTime );

 

SystemTimer, LocalTime

파일의 생성, 접근, 변경 시간 등은 FILETIME 구조체를 사용해서 보관됩니다.

 

FILETIME은 세계표준시간 1601년 1월 1일 0시를 기점으로 얼마만큼 경과가 되었는지가 100 nano second 단위로 기록 되어 있습니다. FAT 파일 시스템에서는 지역 시간으로 NTFS파일 시스템에서는 표준 시간을 기준으로 기록합니다. FILETIME 구조체는 아래와 같은 64비트 값을 보관 할 수 있습니다.

 

특정 파일의 시간을 구하려면 아래 함수를 사용합니다.

BOOL GetFileTime( HANDLE hFile, LPFILETIME lpCreationTime,
 LPFILETIME lpLastAccessTime,
 LPFILETIME lpLastWriteTime );

FILETIME 을 SYSTEMTIME 으로 변경하려면 아래 함수를 사용합니다.

BOOL FileTimeToSystemTime( const FILETIME* lpFileTime,
 LPSYSTEMTIME lpSystemTime );

 

아래 예제는 특정 파일의 생성, 마지막, 접근, 마지막 변경된 시간을 출력해주는 예제입니다.

void PrintTime(const SYSTEMTIME* pst, HDC hdc, int y)
{
   TCHAR date[256] = {0};
   TCHAR time[256] = {0};
   GetDateFormat( LOCALE_USER_DEFAULT, 0, pst, TEXT("yyyy년 M월d일"), date, 256);
   GetTimeFormat( LOCALE_USER_DEFAULT, 0, pst, TEXT("tt h시 m분 s초"), time, 256);
   TextOut(hdc, 10,y+10, date, wcslen(date));
   TextOut(hdc, 10,y+30, time, wcslen(time));
}

BOOL PrintFileTime(HANDLE hFile, HDC hdc)
{
   FILETIME ftCreate, ftAccess, ftWrite;
   SYSTEMTIME stUTCCreate, stLocalCreate, stUTCAccess, stLocalAccess, stUTCWrite, stLocalWrite;
   
   if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite)) return FALSE;
   FileTimeToSystemTime(&ftWrite, &stUTCCreate);
   SystemTimeToTzSpecificLocalTime(NULL, &stUTCCreate, &stLocalCreate);
   FileTimeToSystemTime(&ftAccess, &stUTCAccess);
   SystemTimeToTzSpecificLocalTime(NULL, &stUTCAccess, &stLocalAccess);
   FileTimeToSystemTime(&ftWrite, &stUTCWrite);
   SystemTimeToTzSpecificLocalTime(NULL, &stUTCWrite, &stLocalWrite);
   
   //Creation Time   
   PrintTime( &stLocalCreate, hdc, 0);
   
   //Last-Access Time :
   PrintTime( &stLocalAccess, hdc, 50);
   
   //"Last-Write Time :
   PrintTime( &stLocalWrite, hdc, 100);
   return TRUE;
}

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
   switch( msg )
   {
      case WM_LBUTTONDOWN:
      {
         HANDLE hFile = CreateFile( TEXT("C:\\Windows\\system32\\calc.exe"),
         GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING,
         FILE_ATTRIBUTE_NORMAL, 0);
         HDC hdc = GetDC(hwnd);
         PrintFileTime( hFile, hdc );
         ReleaseDC(hwnd, hdc);
      }
      return 0;

 

Windows Time

운영체제는 부팅한 후 경과된 시간을 1ms 단위로 기록하고 있는데 이를 Tick Count 라고 합니다.

DWORD GetTickCount()

 

WM_TIMER

키보드나 마우스는 사용자로분터 입력되는 메시지입니다. 메시지는 사용자의 입력으로부터 유발되는 것이 보통이지만 사용자의 동작과는 상관없이 발생되는 메시지도 있습니다. 대표적으로 타이머 메시지인 WM_TIMER를 들 수 있습니다. 이 메시지는 한번 지정해 놓기만 하면 일정한 시간 간격을 두고 연속적으로 계속 발생합니다.

 

주기적으로 같은 동작을 반복해야 한다거나 여러 번 나누어 해야 할 일이 있을 때 이 메시지를 사용합니다.

 UNIT SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);
  • 기능 : 타이머를 생성
  • hWnd : 타이머 메시지를 받을 윈도우
  • IDEvent : 타이머의 번호를 지정 ( 여러개의 타이머를 사용할 경우 겹치지 않도록 번호를 부여해야 합니다.)
  • uElapse : 1/1000초 단위로 타미어 주기를 설정합니다. ( 1000 -> 타이머 메시지가 1초에 한번씩 발생 )
  • IpTimerFunc : 타이머 메시지가 발생할 때마다 호출될 함수를 지정합니다. ( NULL을 입력할 경우 WM_TIMER를 반복 호출합니다.)
  • 리턴값은 타이머를 소유하는 윈도우 없이 타이머가 만들어졌을 경우만 의미가 있습니다. SetTimer의 첫번째 인수가 NULL일 경우에 한해 특별하게 사용 됩니다.

 

KillTimer( HWND hWnd, UINT uIDEvent )
  • 기능 : 설치된 타이머를 제거
  • hWnd : 이 타이머를 소유한 윈도우 핸들
  • uIDEvent : 타이머 ID

타이머는 시스템 전역 자원이므로 한번 설정해 놓으면 윈도우가 파괴되어도 파괴되지 않고 계속 남아 있게 됩니다. 따라서 프로그램이 종료될 때 자신이 설정해 놓은 타이머는 직접 파괴해 주어야 합니다.

 

case WM_CREATE: 
   {
      SetTimer(hwnd, 1, 1000, NULL);
   }
   return 0;

case WM_TIMER: 
{
   if(wParam == 1)
   {
      SYSTEMTIME st;
      GetLocalTime(&st);
      TCHAR buf[20];
      wsprintf(buf, TEXT("현재 시간 : %d:%d:%d"),st.wHour, st.wMinute, st.wSecond);
      SetWindowText(hwnd, buf);
   }
}
return 0;

 

Timer 사용 예제입니다.

 

 

 

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기