0
#include <windows.h>

int main()
{

    XFORM blah;
    blah.eM22 = 1.0f;
    blah.eDx = 0.0f;
    blah.eDy = 0.0f;
    blah.eM11 = 1.0f;
    float blahm1 = 0.0;
    float blahm2 = 0.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)
    {
        HDC hdc_x = GetDC(HWND_DESKTOP);
        blahm2 = (blahm2 + 0.0001f);
        blah.eM12 = blahm1;
        blah.eM21 = blahm2;
        SelectObject(hdc, cross);
        SetGraphicsMode(hdc_x, GM_ADVANCED);
        SetWorldTransform(hdc_x, &blah);
        BitBlt(hdc_x,512,384,800,703,hdc,0,0,SRCAND);
        ReleaseDC(HWND_DESKTOP,hdc_x);
    }

    return 0;
}

我不希望这会如此疯狂地滞后,但是当我一次执行该程序的 2 个实例时,我的整个计算机实际上变得没有响应,例如,如果我在这种情况下右键单击,菜单实际上需要大约 10 秒出现。

4

4 回答 4

3

无限循环本身可能是一个问题,但我认为实际问题(假设您确实希望它无限循环!)更多来自它是一个紧密且无限循环的事实,并且它不允许调度程序将控制权交还给其他任务。

为了解决这个问题,您应该确保您的循环允许其他任务有机会运行。

“休眠”通常是一个简单的解决方案,或者在线程之间进行实际同步。

于 2013-06-10T01:02:33.933 回答
2

删除无限循环:

while (1)
{
    // Repeat this code forever...
}
于 2013-06-10T00:57:13.863 回答
1

您在这里有 2 个选项:

  1. 正如其他人所提到的,在您的 while 循环中以某种方式添加一个中断
  2. 使用线程,在你的 while 循环中使用 sleep(nb_milliseconds) 来平滑 CPU 资源的使用。

顺便说一下,第二个选项的优点是允许您从程序的单个实例同时运行两个治疗实例。

警告:根据编译器或平台,线程的处理方式不同,但您会发现自己。

于 2013-06-10T01:02:09.013 回答
1

我想我明白你在这里想要做什么;但这不是 Windows 程序的编写方式。

如果您查看这个示例程序,您会发现它有一些处理WM_PAINT消息的代码。那就是您的代码所在的位置。

编辑添加

我没有注意到绘制的对象移动。因此,最好的方法之一是:

1) 用于SetTimer()在应更新职位时向自己发送消息

2)当你收到WM_TIMER消息时,计算新的位置并调用InvalidateRect()(告诉 Windows 有东西要重绘)

3)在WM_PAINT处理程序中,进行实际绘图。

所有这一切的重点是让 Windows 为您进行调度,保持 UI 响应。

于 2013-06-10T01:12:56.860 回答