2013-06-17 5 views
2

은이 코드를 사용하여 360도 정확히 10 초 동안 손의 작은 사진을 회전 응용 프로그램을 만들려고 :루틴이 정시에 실행되는지 어떻게 확인합니까?

#include <windows.h> 
#include <tgmath.h> 

void rotatebmp (HDC hdc_x, float q, float x0, float y0) 
{ 
    q = (q * 0.01745333055); 
    XFORM blah; 
    blah.eM11 = cos(q); 
    blah.eM12 = sin(q); 
    blah.eM21 = -sin(q); 
    blah.eM22 = cos(q); 
    blah.eDx = x0 - cos(q)*x0 + sin(q)*y0; 
    blah.eDy = y0 - cos(q)*y0 - sin(q)*x0; 
    SetWorldTransform(hdc_x, &blah); 
    return; 
} 

int main() 
{ 
    float q = 0; 
    HDC hdc = CreateCompatibleDC(NULL); 
    HBITMAP hand = (HBITMAP)LoadImage(NULL, ("C:\\Documents and Settings\\Death\\My Documents\\45Hand.bmp") ,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
    HBITMAP handmask = (HBITMAP)LoadImage(NULL, ("C:\\Documents and Settings\\Death\\My Documents\\45Hand2.bmp") ,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
    while (1) 
    { 
    q = (q + 3.6); 
    HDC hdc_x = GetDC(HWND_DESKTOP); 
    SetGraphicsMode(hdc_x, GM_ADVANCED); 
    SelectObject(hdc, handmask); 
    rotatebmp (hdc_x, q, 850, 375); 
    BitBlt(hdc_x,550,0,600,527,hdc,0,0, SRCAND); 
    ReleaseDC(HWND_DESKTOP,hdc_x); 
    hdc_x = GetDC(HWND_DESKTOP); 
    SetGraphicsMode(hdc_x, GM_ADVANCED); 
    SelectObject(hdc, hand); 
    rotatebmp (hdc_x, q, 850, 375); 
    BitBlt(hdc_x,550,0,600,527,hdc,0,0, SRCPAINT); 
    ReleaseDC(HWND_DESKTOP,hdc_x); 
    Sleep(100); 
    } 
    return 0; 
} 

나는이와 함께 무엇입니까 문제는 실행이 부진 하나 개의 실행 점이다 루프의 합계는 을 제외하고 0.06 초가 걸릴 것입니다. 합계를 계산 했으므로 예상 된 10 초 대신 16 초가되었습니다. 루프가 실행되기 시작한 시간이 얼마나 경과했는지 어떻게 알 수 있습니까? 스레드를 사용하는 것이 유일한 방법이라고 생각 하겠지. 다중 코어 프로세서가 아닌 경우에는 리소스가 쪼개져있어 루프가 느려질 수도 있습니다. Sleep()과 같은 명령은 시간을 어떻게 추적합니까? 확인하는 컴퓨터에 내부 시계가 있습니까? 그렇다면 어떻게 그 시계에 액세스 할 수 있습니까?

+0

POSIX는 이것을 위해'alarm'을 가지고 있습니다 - Windows는 아마 비슷한 것을 가지고 있습니다. 구글 "타이머". –

답변

2

루틴을 정시에 실행하려면 어떻게해야합니까?

보장 할 수 없습니다. OS가 어떤 일을하는 데 바쁜 시간이 걸리면 (예를 들어, 스와핑), 프로그램에 CPU 시간을주지 않기로 결정할 수 있습니다. OS가 실제로 바쁠 경우 프로그램을 CPU 시간없이 30 초 이상 사용할 수 있습니다.

그러나 루프에서 비트 맵을 다시 그려서는 안됩니다. 정확하지 않습니다.

대신에 GetTickCuont 또는 QueryPerformanceCOunter을 사용하여 얼마나 많은 시간이 경과했는지 측정하거나 Windows Timers을 사용해야 N 밀리 초마다 알림을 받아야합니다. OS가 사용중인 경우 예상보다 늦게 알림을받을 수 있습니다.

사용 방법에 관계없이 프로그램을 완료하는 데 10 초 밖에 걸리지 않을 것이라고 100 % 확신 할 수는 없습니다. 이를 위해서는 리얼 타임 OS 또는 리얼 모드 "OS"(FreeDOS/MS-DOS/Adruino Board 등)가 필요합니다.

+0

감사합니다. [this] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644900%28v=vs.85%29.aspx) 문서에서 발견 한 링크를 통해, 거기서 시작하겠습니다. – user2462027

관련 문제