我怎样才能优化此代码以免“冻结”我的电脑?

时间:2013-06-10 00:54:28

标签: c++ performance optimization

#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 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

删除无限循环:

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

答案 2 :(得分:1)

这里有2个选项:

  1. 正如其他人所说,在你的while循环中以某种方式添加休息
  2. 在while循环中使用带睡眠(nb_milliseconds)的线程来平滑CPU资源的使用。
  3. 第二个选项的优点是允许您顺便从一个程序实例同时运行两个治疗实例。

    警告:根据编译器或平台的不同,线程的处理方式不同,但您可以自己找到。

答案 3 :(得分:1)

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

如果查看this sample program,您会看到它有一些处理WM_PAINT消息的代码。这就是你的代码所在。

已编辑添加

我没有注意到绘制的物体移动。因此,有一种更好的方法可以做到这一点:

1)使用SetTimer()在更新位置时向自己发送消息

2)收到WM_TIMER消息后,计算新位置并调用InvalidateRect()(告诉Windows有重绘的内容)

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

所有这一切的要点是让Windows为您做日程安排,保持UI的响应性。