![](/img/trans.png)
[英]I can't make my function calculate how much time has passed and print stuff accordingly
[英]How to determine how much time has passed without a timer?
我正在尝试制作一个可以在10秒内旋转并绘制360度位图的程序,但是我发现执行此操作的方法不是即时的,甚至不是关闭的,因此我的函数无法在预计时间。 为了弥补这一点,我决定确定自函数开始以来经过了多少时间,我使用该函数来旋转图像并绘制图像直到完成,并增加执行所需的额外旋转时间。
我研究了计时器,我知道我可以创建一个计时器,以增加一个变量来“计数”经过了多少时间,但是为了使其足够准确,它必须至少每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;
}
Windows提供了一对用于获得经过时间的高度精确的功能。 QueryPerformanceCounter
将给出当前计数,而QueryPerformanceFrequency
将给出每秒计数。
只需在开始时获取计数,在末尾获取另一个计数,从末尾减去起始点,然后除以频率即可获得经过时间。
为了解决这个问题,我发现timeGetTime()和timeBeginPeriod()和timeEndPeriod()最为准确,而且不会出现严重错误的结果,QueryPerformanceCounter和QueryPerformanceFrequency对我没有帮助,他们抛出了疯狂的结果,是随机的,有时甚至产生负值。
GetTickCount的()是slighlty不太准确然后timeGetTime(根据此文章),并阅读了大量的其他信息,关于这个问题后,我得出的结论是,timeGetTime()是在精度和可靠性方面的最佳通用定时器。
我不确定我是否了解您要在这里做什么。 如果我理解正确,您是否想在10秒钟内将图像旋转360度?
如果是这种情况,则需要每27毫秒进行一次旋转。 尽管Windows中的“睡眠”并不是十分准确(您可能要等待15毫秒才能“唤醒”),但这可能是您最接近的解决方案。
C#的另一种选择(可能只是我不了解的C ++中可能有一种方法)是使用事件。 例如,在C#中,很容易创建一个计时器,以毫秒为单位计时,并且每次达到27时,都会触发对Rotate函数的异步调用。 在计时器继续滴答的同时,这将有效地重新绘制图像。 如果C#对您来说是一条可行的道路,我很乐意提供一些代码
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.