|
GetTickCount() 으로 처리할 수 있는 Time Duration은 1193 시간에 불과 하므로
1400 시간이 지났다면 오버 플로우 상태가 되니까 마이너스 연산으로 뒤집어지는
결과가 발생함. 오버 플로우 상태를 고려하지 않은 프로그램의 논리적인 오류임.
오버 플로우를 고려하려면 매번 최상위 비트를 체크해서 반대로 연산을 뒤집어주는
코드가 들어가야 함. 프로그래밍의 아주 기초적인 부분임.
GetTickCount64() 를 이용하더라도 Time Duration 만 커질 뿐 근본적인 해결책이 되지는 못함.
따라서 GetTickCount() 이나 GetTickCount64() 함수를 이용하는 것 보다는.
강제 종료용 이벤트를 하나 생성해서 WaitForMultipleObjects() 로 스레드가 10초 동안 슬립 상태로 들어가게
코딩을 하는 게 더 효율적인 방법임.
이경문 님이 쓰신 글 :
: GetTickCount()의 return값은 DWORD(unsigned int 32 bit) 이죠.
: DWORD의 range(msec 단위)의 최대값을 날짜로 환산해 보세요.
:
: 김시환 님이 쓰신 글 :
: : 답변은 감사합니다.
: : 그런데 해결방법도 중요하지만 원인을 좀 알고 싶은데요.. 해결하는거야 어떻게든 가능하지만 원인을 아는게 프로그램하는 사람으로서 더 필요한 정보일것 같아서요..
: :
: : Lyn 님이 쓰신 글 :
: : : GetTickCount64로 바꾸면 문제 깔끔하게 해결 ...
: : :
: : : 김시환 님이 쓰신 글 :
: : : :
: : : : 샘플시료의 Aging을 위해 장비를 오랜시간 돌리는 프로그램을 작성하고 샘플시료를 테스트하고 있습니다.
: : : : Aging 중간 중간에 Aging 상태에 대한 내용을 읽어와서 데이타를 화면에 보여주는 프로그램입니다.
: : : : Aging 을 하면서 데이타를 읽어내는 것은 Thread를 사용하고 있습니다.
: : : :
: : : : while(!Terminated)
: : : : {
: : : : m_dfDelayTime = (GetTickCount() / 1000.0) - m_dfStartTime ;
: : : :
: : : : if(m_dfDelayTime > 10) // 10초에 한번씩 시스템데이타를 읽어 온다.
: : : : {
: : : : Data_Read() ;
: : : :
: : : : m_dfStartTime = GetTickCount() / 1000.0 ;
: : : : }
: : : :
: : : : if(user_stop == true) this->Terminate() ;
: : : :
: : : : if( g_dfTestTime <= 0) Sample_Test()
: : : : }
: : : :
: : : : 대충 위의 코드와 같은 동작이 쓰레드에서 구동중입니다. 지금 거의 1400 시간 정도 돌아가고 있는데.. 문제는 지금까지 잘 실행되던 Data_Read() 함수가 호출이 안돼고 있다는 것입니다. 그래서 처음에는 쓰레드가 뻣었나 싶어서 시스템을 정지시키려고 했다가 혹시나 하는 맘으로 Sample_Test() 라는 함수가 진행되는지 지켜보았습니다. 아니나 다를까 Sample_Test() 함수는 정상적으로 실행이 되고 있었습니다.
: : : :
: : : : 여기서 의문
: : : :
: : : : 10초에 한번씩 시스템 데이타를 읽어오기 위한 함수가 왜 호출이 안돼느냐 하는 문제입니다.
: : : : 처음에는 m_dfStartTime 를 초기화하지 않았다고 생각했는데 코드를 보니 그것도 아니더군요..
: : : : GetTickCount() 함수를 보면 49.7 일 후에 다시 0으로 회귀하는 것으로 되어 있어서 m_dfStartTime 변수를 계속해서 갱신해 주면 문제가 없을것 같은데.. 뭐가 문제일까요??
: : : :
: : : : 테스트 진행중이라 디버깅도 못해 보겠고.. 이 문제를 해결하려고 다른 PC를 근 50일을 돌려 볼수도 없고.. 참 애매 합니다.
: : : :
: : : :
|