프로그램 코딩중에 이상한 현상을 발견했다.
ACE에서 ACE_Date_Time과 ACE_Time_Value를 사용하기 위해서는 SYSTEMTIME과 FILETIME을 사용
해야 겠다고 잠정 결론 내렸었다.
(ACE_Time_Value에서 FILETIME을 이용해서 Set할수 있고, SYSTEMTIME을 이용하면, 시간을 명시적으로
바꿀수 있다.
ACE_Date_Time은 ACE_Time_Value로부터 값을 받아 Date/Time을 나타내긴 하지만, 다시
ACE_Time_Value로 값을 돌려주지는 않는다.
무지 답답)
결국 이것 저것 찾아본 결과,
현재 시간 획득(SYSTEMTIME) - GetSystemTime or GetLocalTime
시간 적당히 수정 - SYSTEMTIME 구조체
FILETIME으로 Convert - SystemTimeToFileTime
맞지않는 시간 조절 - LocalFileTimeToFileTime
ACE_Time_Value에 시간 설정 - Set
ACE_Date_Time에 시간 설정 - update
와 같은 대단한 짓(?)을 해야 한다.
암튼 그런 식으로 코딩을 어떻게 했다.
근데, Release에서 컴파일만 하면 날짜가 이상하게 변하는 거였다.
이것 저것 바꿔봐도 이유를 알수 없어서, Test 프로그램을 만들어 봤다.
#include "ace/SString.h"
#include "ace/Date_Time.h"
#include <time.h>
void PrintSystemTime(SYSTEMTIME& st, ACE_TString str)
{
ACE_DEBUG(( LM_INFO,
ACE_TEXT("%I %s : SystemTime %04d/%02d/%02d %02d:%02d:%02d\n"),
str.c_str(),
st.wYear,
st.wMonth,
st.wDay,
st.wHour,
st.wMinute,
st.wSecond));
}
void PrintFileTime(FILETIME& ft, ACE_TString str)
{
ACE_Time_Value tv(ft);
ACE_Date_Time dt;
dt.update(tv);
ACE_DEBUG(( LM_INFO,
ACE_TEXT("%I %s : FileTime %04d/%02d/%02d %02d:%02d:%02d\n"),
str.c_str(),
dt.year(),
dt.month(),
dt.day(),
dt.hour(),
dt.minute(),
dt.second()));
FILETIME ft2;
SYSTEMTIME st;
FileTimeToLocalFileTime(&ft, &ft2);
FileTimeToSystemTime(&ft2, &st );
ACE_DEBUG(( LM_INFO,
ACE_TEXT("%I %s : FileTime %04d/%02d/%02d %02d:%02d:%02d\n"),
str.c_str(),
st.wYear,
st.wMonth,
st.wDay,
st.wHour,
st.wMinute,
st.wSecond));
}
int ACE_TMAIN(int, ACE_TCHAR *[])
{
FILETIME ft, ft2;
SYSTEMTIME st;
GetLocalTime(&st);
PrintSystemTime( st, "GetLocalTime");
// 날자만 필요. 오늘 0시로 바꾼다
st.wHour = st.wMinute = st.wSecond = st.wMilliseconds = 0;
PrintSystemTime( st, "Set hours zero");
ACE_ASSERT((SystemTimeToFileTime(&st, &ft)));
PrintFileTime( ft, "SystemTimeToFileTime(Using ACE_ASSERT)");
ACE_ASSERT((LocalFileTimeToFileTime(&ft, &ft2)));
PrintFileTime( ft2, "LocalFileTimeToFileTime(Using ACE_ASSERT)");
SystemTimeToFileTime(&st, &ft);
PrintFileTime( ft, "SystemTimeToFileTime");
LocalFileTimeToFileTime(&ft, &ft2);
PrintFileTime( ft2, "LocalFileTimeToFileTime");
return 0;
}
소스를 보면 알겠지만 Debug시에는 두개의 값이 다 잘 출력된다.
하지만 Release로 컴파일 해보면 ACE_ASSERT로 감싼 함수는 FILETIME 값이 이상하게 변하는 거였다.
그랬다. 전혀 생각지도 않았던 ACE_ASSERT 가 문제였던 것이다.
앞으로 이런 문제가 얼마나 더 일어날지... 걱정스럽다.
나의 코딩 방식에 문제가 있다고 결론내릴수 밖에 없다 T_T