我正在尝试创建一个应用程序,使用此代码将手的小图片在10秒内旋转360度:
#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秒,不包括Sleep(100)
,因为我计算了总数,它出现了16秒而不是预期的10秒秒。如何确定从循环开始运行的时间过去了多长时间?我认为唯一的方法是使用线程,而在非多核处理器上,我认为可能会使循环运行得更慢,因为它正在分割资源,是吗? Sleep()这样的命令如何跟踪时间?它检查的计算机上是否存在内部时钟?如果是这样,我如何访问该时钟?
答案 0 :(得分:2)
如何确保例程按时执行?
你无法保证。因为在任何给定的时间,如果OS真的忙于做某事(例如交换),它可能决定不给你的程序任何CPU时间。如果操作系统真的很忙,你的程序可以在没有任何CPU时间的情况下保持30秒或更长时间。
但是,您不应该在循环中重绘位图。这不是一个精确的。
相反,您应该使用GetTickCuont或QueryPerformanceCOunter来衡量已经过了多长时间,或者您应该使用Windows Timers以便每N毫秒接收一次通知。 (如果操作系统繁忙,您可以收到比预期更晚的通知。)
无论您决定使用何种方法,您都无法100%确定您的程序只需10秒即可完成。为此,您需要实时操作系统或实模式“操作系统”(例如我们的FreeDOS / MS-DOS / Adruino Board等)。