2013-06-25 47 views
0

我試圖做一個程序,旋轉並繪製一個位圖360度超過10秒,但我發現我用這樣做的方法不是即時或甚至關閉的,所以我的函數不會在預期的時間內執行。爲了彌補這一點,我決定確定從我開始使用的函數開始旋轉圖像並繪製它直到完成它的時間已經過去了多長時間,並且增加了執行所花費的額外時間來增加它的旋轉量。如何確定在沒有計時器的情況下已經過了多少時間?

我看了一下定時器,我知道我可以創建一個計時器來增加一個變量來「計數」已經過了多少時間,但爲了使它足夠精確,至少每一次都必須使用它50毫秒(可能更短),當我的重複功能已經每個週期大約需要0.4秒來完成時,我希望它是瞬間或接近即時,我覺得這可能會消耗太多的額外資源,並希望尋找不同的解決方案。

如果您需要任何代碼在這裏,它是:

#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 cross = (HBITMAP)LoadImage(NULL, ("C:\\Documents and Settings\\Death\\My Documents\\45Hand.bmp") ,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 
    HBITMAP crossmask = (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, crossmask); 
    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, cross); 
    rotatebmp (hdc_x, q, 850, 375); 
    BitBlt(hdc_x,550,0,600,527,hdc,0,0, SRCPAINT); 
    ReleaseDC(HWND_DESKTOP,hdc_x); 
    Sleep(10); 
    } 
    return 0; 
} 
+2

嘗試計時器,看看它是否有效,然後放棄這個想法。 –

+2

'50 ms','0.4s' - GetTickCount()遠遠超過這個速度!閱讀真正的'花時間'只會更快,速度更快。 –

回答

0

要解決此問題,我發現timeGetTime()與timeBeginPeriod()和timeEndPeriod()是最準確的,沒有嚴重錯誤結果的可能性, QueryPerformanceCounter和QueryPerformanceFrequency對我來說並沒有訣竅,他們拋出瘋狂的結果,看起來是隨機的,有時甚至產生負值。 ()根據this文章)讀取了很多關於這個主題的其他信息後,GetTickCount()的精度就不那麼準確了,我得出結論:timeGetTime()是最好的通用計時器,準確性和可靠性。

1

Windows提供了對功能,讓經過的時間,是非常精確的。 QueryPerformanceCounter將給出當前計數,而QueryPerformanceFrequency給出每秒計數的數量。

只需在開始時獲得計數,在最後得到另一個計數,從最後減去開始,然後除以頻率得到經過的時間。

+0

當使用QueryPerformanceCounter – user2462027

+0

@ user2462027時,我得到「error_noaccess」,錯誤表示您傳遞了一個無效指針作爲函數的參數。 –

+0

你確定它不是[this](http://bobmoore.mvps.org/Win32/w32tip75.htm)?我不認爲我改變了數據打包隊列,但我不確定,應該只使用這兩行代碼:PLARGE_INTEGER blahstring;和QueryPerformanceCounter(blahstring);導致那個錯誤? – user2462027

-1

我不知道我明白你在這裏要做什麼。如果我理解正確,你想旋轉一個360度的圖像整整10秒?

如果是這種情況,您需要每27毫秒進行一次旋轉。儘管Windows中的睡眠並不準確(您可能會等待15毫秒以「醒來」),但這很可能是您最接近的解決方案。

在C#中的另一種選擇(並可能有一種方法來做到這一點在C + +我只是不知道它)是使用事件。例如在C#中,創建一個以毫秒爲單位的計時器非常簡單,每次達到27時,它都會觸發對您的旋轉函數的異步調用。當計時器繼續滴答時,這將有效地重新繪製圖像。如果C#是一個可行的路徑,我很樂意提供一些代碼

+1

爲什麼你需要每27毫秒旋轉一次?沒有理由一次旋轉一度。 –

+0

這是絕對正確的,也是爲什麼我問他在做什麼的一部分。但是,這個概念是一樣的,旋轉較大的定時器較長 – sedavidw

+1

定期旋轉一個固定量不是一種方法。相反,只要您希望更新圖形,請查看以秒爲單位的時間(t),將原始圖像旋轉(t * 360/10)度並繪製。 –

相關問題