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
[38863] Re:나노 Sleep을 할수 있는 함수나 방법이 있나요?
열씸! [cappuccino] 1393 읽음    2005-01-21 18:06
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을 할수 있는 함수나 방법이 있나요? 열씸! 1393 2005/01/21
38893         Re:Re:나노 Sleep을 할수 있는 함수나 방법이 있나요? cmania 1216 2005/01/24
38868         Re:Re:해보니 안된다. 우에 된일인고? 김상면 1221 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:해보니 안된다. 우에 된일인고? <<== 죄송합니다. 그리고요 그래도 안되요? 열씸! 1021 2005/01/22
38883                         Re:Re:Re:Re:Re:Re:해보니 안된다. 우에 된일인고? <<== 죄송합니다. 그리고요 그래도 안되요? 김상면 1084 2005/01/22
38873                 Re:Re:Re:Re:해보니 안된다. 우에 된일인고? 열씸! 1254 2005/01/22
38864         Re:Re:나노 Sleep을 할수 있는 함수나 방법이 있나요? 1245 2005/01/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.