繁体   English   中英

如何确定没有计时器经过了多少时间?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM