|
음... 뭔가 이상하군요.
타이머의 이터벌을 100msec 정도 주어도
시간을 1초 단위로 출력한다면 사람이 눈으로 인식할 수 없을 정도로
정확하게 출력됩니다.
시간을 찍을 때 타이머가 호출 될 때 마다 설정된 인터벌 값을 누적하는 방식으로 계산하면 오차가 발생할 수 있습니다.
절대 이런 방식은 사용하지 마세요.
틱카운트라든지 프리컨시 등을 사용하셔야합니다.
게시판 여기저기 검색해 보시면 정밀한 타이머, 정밀한 시간 등으로 검색해보면 많이 나오지 싶습니다.
프로그램 초짜 님이 쓰신 글 :
: 답변 감사합니다. 검색을 생활화 하겟습니다.
:
: 1ms 정도의 미세오차를 보고 싶은게 아니구요
:
: 단순히 1초에 한번씩 뿌리고 싶은건데요...
:
: 현제 시간이 2시 10분 50초
: 현제 시간이 2시 10분 51초
: 현제 시간이 2시 10분 52초
: 현제 시간이 2시 10분 53초
: 현제 시간이 2시 10분 54초
: 현제 시간이 2시 10분 55초
:
: 위에처럼 나오는게 목적인데 지금은
:
: 현제 시간이 2시 10분 50초
: 현제 시간이 2시 10분 51초
: 현제 시간이 2시 10분 52초
: -
: 현제 시간이 2시 10분 54초
: 현제 시간이 2시 10분 55초
: 현제 시간이 2시 10분 56초
: -
: 현제 시간이 2시 10분 58초
:
: 저기 띄운 부분이 2초의 텀을 가진다는거죠... ㅎㅎ
:
: 그게 문제인거에요 ㅜㅜ
:
:
: Intotheblue 님이 쓰신 글 :
: : 타이머 인터발 관련 글은.. 여기 검색해 보시면 답이 나옵니다.
: : 다음이는 질문전에 검색을 해보세요.
: :
: : 윈도우 타이머는 50ms 이내 에서는..
: : 오차가 많이 발생합니다.
: :
: : 또 50ms 이상이라고 해도..
: : 멀티 태스킹 os 특성상.. 다른쪽 등에서 과부하가 걸리거나 하면..
: : 당연히 또 오차가 발생합니다.
: :
: : 1ms 정확도로 동작을 시키려면..
: : 멀티미디어 타이머가 따로 있는에.. 사용에 제약도 있고..
: : 일반 타이머 보단 조금 복잡합니다.
: :
: : 1 ms 단위로 아주 정밀한 제어가 필요하면...
: : os 를 vxworks 같은 real time os 로 변경하시는게 나을수도 있습니다.
: :
: :
: :
: : 프로그램 초짜 님이 쓰신 글 :
: : : 제가 타이머 인타발을 20으로 하고
: : :
: : : 타이머 내부에서 아이들을 50을 주고 1초를 만들엇는데요
: : : Start
: : : The time is Sec 0 of MSec 772
: : : The time is Sec 0 of MSec 772
: : : Start
: : : The time is Sec 0 of MSec 804
: : : The time is Sec 0 of MSec 804
: : : Start
: : : The time is Sec 0 of MSec 835
: : : The time is Sec 0 of MSec 835
: : : Start
: : : The time is Sec 0 of MSec 866
: : : The time is Sec 0 of MSec 866
: : : Start
: : : The time is Sec 0 of MSec 897
: : : The time is Sec 0 of MSec 897
: : : Start
: : : The time is Sec 0 of MSec 928
: : : The time is Sec 0 of MSec 928
: : : Start
: : : The time is Sec 0 of MSec 960
: : : The time is Sec 0 of MSec 960
: : :
: : : 위에 보시는거처럼 타이머 끝난 지점에서 772 가 다음 시작은 804인거 같습니다.
: : :
: : : 그럼 대략 32MSec에서 31MSec 까지 수준인거 같습니다.
: : : 인타발은 20인데 ㅜㅜ 그말은 외부 코드에 의해서 타이머가 조금씩 지연되는거 같습니다.
: : : 고곤 이해는 되는데 해결할 방법은 없을까요?
: : : 으흑.... 32MSec가 누적이 되서 그런거 같습니다.
: : : 20인타발을 49회 무시하고 50회 째에 작동하는데요
: : :
: : : 대략 32MSec에러값 * 50번 하니까 1.6초가 나오는군요
: : :
: : : 지금 1.6초 가량 지연되는걸로 보입니다.
: : :
: : :
: : : 20인타발로 쓰는이유는 프로그램에서 필요한 5가지 정도의 모드가 있습니다.
: : : 예를들면 저장모드,화면에 뿌리는모드,데이타 읽는 모드... 등등
: : : 모드별로 시간을 다르게 지정해 주기 위해서 하다보니 저런 코드가 만들어졌습니다.
: : : MOD를 50로 잡고
: : : 10에서 코드 하나 처리하고 빠져나오고
: : : 20에서 코드하다 처리하고 빠져 나오고 하는등등...
: : :
: : : 제가 좀 무리하게 짠 건가요...
: : :
: : : 마이컴 짜는 습관으로 짜다보니... 영 어렵군요 ㅎ
: : :
: : :
: : :
: : : 송신영 님이 쓰신 글 :
: : : : 코드에 문제가 있는겁니다.
: : : : 타이머가 정확한 것은 아니지만 인터벌을 1000msec로 설정시
: : : : 2초 정도에 한번 실행되고 하는 정도는 아닙니다.
: : : : 타이머 내부에서 먼가 딜레이를 많이 잡아먹고 있는 겁니다.
: : : : 타이머 함수 시작 부분에서 시간 찍고 마지막 부분에서 시간 찍어서
: : : : 차이가 얼마나 나는지 확인해보세요.
: : : :
: : : : 프로그램 초짜 님이 쓰신 글 :
: : : : : 안녕하세요 초짜 프로그래머 입니다.
: : : : :
: : : : : 기계와 통신하는 프로그램을 주로 다룹니다...
: : : : :
: : : : : State 라는 데에 현제 상태를 저장합니다...
: : : : :
: : : : : 그럼 GUI에서는 현제 상태를 저장합니다.
: : : : :
: : : : : 타이머를 이용해서...
: : : : :
: : : : : sprintf(TempStatedata, "상태는 %s, 시간은 %s, " State,TimeData.c_str());
: : : : :
: : : : : 요론 명령으로 출력합니다.
: : : : :
: : : : : 근데 타이머가 1000인데 시간이 정확히 1초 수준에서 저장이 안되는군요
: : : : :
: : : : : 뭐 가끔 틀려지는거라면 이해 되는데 ( 10초에 1초 정도 까지 괜찬을듯..)
: : : : :
: : : : : 근데 아에 틀어져서 2초 수준에서 1회 저장하는 수준이에요 ㅜㅜ
: : : : :
: : : : : 아마도 다른곳에서 잡고 있거나 할거 같은데..
: : : : :
: : : : : 이런건 스레드 말곤 답이 없나요? 아님 제가 잘못 한건가..
|