如何优化此代码以不"freeze"我的计算机?

How could I optimize this code to not "freeze" my computer?

本文关键字:freeze 我的 计算机 代码 何优化 优化      更新时间:2023-10-16
#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;
}

我不希望这个延迟如此疯狂,但是当我同时执行这个程序的两个实例时,我的整个计算机实际上变得没有响应,例如,如果我在这些情况下右键单击,它将花费大约10秒的时间来显示菜单。

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

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

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

删除无限循环:

while (1)
{
    // Repeat this code forever...
}

你有两个选择:

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

第二个选项的优点是允许您在程序的单个实例中同时运行两个治疗实例。

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

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

如果您看一下这个示例程序,您将看到它有一些处理WM_PAINT消息的代码。这就是你的代码的位置。

编辑添加

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

1)当需要更新位置时,使用SetTimer()给自己发送消息

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

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

这样做的目的是让Windows为你做调度,保持UI响应。