C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[38871] Re:Re:Re:해보니 안된다. 우에 된일인고?
만복대.산수유 [origin] 1397 읽음    2005-01-22 05:15
1. getTick 매크로에서 레지스터들을 사용하는데
getTick 내부에서 해당 레지스터 사용직전에 그 값들을 대피(push 레지스터이름)시킨 후
사용이 끝나면 복원(pop 레지스터이름)시켜야 안전할 것으로 생각됩니다.
당연한 얘기겠지만 pop의 순서는 push의 역순으로 해야 합니다.
2. __asm lea ebx, count; 를 __asm lea ebx, [&count];로 변경
3. 한편 CPU의 실제 속도는 아래 getTick과 더불어 QueryPerformanceCounter, QueryPerformanceFrequency WinAPI를 사용하면 알 수 있습니다. 아마도 2,3초 이상을 경과시켜보면 99% 정확한 CPU 속도가 나올것입니다.
실제속도를 100% 정확하게 알아내는 방법은 무엇일까요?.

#define getTick(count){                 \
  __asm push eax; \
  __asm push ebx; \
  __asm push edx; \
\
     __asm rdtsc;                        \
     __asm lea ebx, [&count];               \
     __asm mov dword ptr [ebx], eax;     \
     __asm mov dword ptr [ebx + 4], edx; \
\
  __asm pop edx; \
  __asm pop ebx; \
  __asm pop eax; \
}

김상면 님이 쓰신 글 :
: 열씸! 님이 쓰신 글 :
: : RDTSC를 이용한 슬립을 구현하면 됩니다.
: :
: : #define getTick(count){                 \
: :     __asm rdtsc;                        \
: :     __asm lea ebx, count;               \
: :     __asm mov dword ptr [ebx], eax;     \
: :     __asm mov dword ptr [ebx + 4], edx; \
: : }
: :
: : 위에 작성한 것은 64비트 자료형를 파라미터로 받아 전원이 들어온 후 지금까지의
: : CPU 클럭틱을 가지고 오는 매크로 함수죠.
: :
: : __int64 start, end;
: : getTick(start);
: : ::Sleep(1000);
: : getTick(end);
: : ShowMessage(end - start);
: : 해 보시면 1초간 CPU 속도 만큼을 카운트 한다는걸 알 수 있죠.
: : (2.8기가 CPU면 2800000000 회를 카운트 합니다)
: :
: :
: : 쓰레드를 하나 만들고
: : 쓰레드의 실행 함수 안에서
: : __int64 last, current;
: : getTick(last);
: :
: : while(쓰레드 생존여부){
: :     while((getTick(current) - last) < 주기);  // 이부분이 주기 만큼을 놉니다.
: :     last = current;
: :     // 부가 작업.... 예를들어 이 쓰레드 타이머에 등록된 함수 (콜백함수)를 호출해 준다거나,
: :     // 이 쓰레드를 생성시킨 윈도우(혹은 윈 컨트롤)에 메시지를 던지면 되죠.
: : }
: :
: : 이렇게 구성된 타이머 쓰레드를 작성하면 됩니다.
: : 여기서 주기라는걸 나노초와 같은 절대 시간에 맞춰주고 싶다면,
: : 현재 CPU 클럭이 어느정도냐를 위에 언급한 예와 같이 (5초동안 구해서 5로 나눈다든지 하면 더 정확하죠)
: : 산출해서, 그걸 필요 단위 시간으로 다시 나눈 클럭 횟수지요.
: :
: : 물론 이렇게만 구현하면, 처음 1초나 5초동안 산출한 CPU 클럭이 절대적으로 확실한 수치는 아니기에
: : 조금씩 차이가 생길 수도 있습니다만, 일단 나노 수준의 빈도는 보장이 되고,
: : 중간 중간에 현재시간을 읽어 보정을 해 주면 보다 정확해 지지요.

+ -

관련 글 리스트
38860 나노 Sleep을 할수 있는 함수나 방법이 있나요? 빌더파는자 1321 2005/01/21
38920     우선,,기본적인 방법으론 불가능 합니다. 미루(MMISYSTEM) 1202 2005/01/25
38863     Re:나노 Sleep을 할수 있는 함수나 방법이 있나요? 열씸! 1394 2005/01/21
38893         Re:Re:나노 Sleep을 할수 있는 함수나 방법이 있나요? cmania 1217 2005/01/24
38868         Re:Re:해보니 안된다. 우에 된일인고? 김상면 1222 2005/01/22
38876             Re:Re:Re:해보니 안된다. 우에 된일인고? 열씸! 1106 2005/01/22
38871             Re:Re:Re:해보니 안된다. 우에 된일인고? 만복대.산수유 1397 2005/01/22
38879                 Re:Re:Re:Re:해보니 안된다. 우에 된일인고? <<== 죄송합니다. 그리고요 그래도 안되요? 김상면 1189 2005/01/22
38880                     Re:Re:Re:Re:Re:해보니 안된다. 우에 된일인고? <<== 죄송합니다. 그리고요 그래도 안되요? 열씸! 1022 2005/01/22
38883                         Re:Re:Re:Re:Re:Re:해보니 안된다. 우에 된일인고? <<== 죄송합니다. 그리고요 그래도 안되요? 김상면 1084 2005/01/22
38873                 Re:Re:Re:Re:해보니 안된다. 우에 된일인고? 열씸! 1255 2005/01/22
38864         Re:Re:나노 Sleep을 할수 있는 함수나 방법이 있나요? 1246 2005/01/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.