C++;windows程序占用30%的CPU,API使用是否过时?

C++;windows程序占用30%的CPU,API使用是否过时?,c,windows,C,Windows,我一直在学习windows/OpenGl编程的Cprogramming教程,到目前为止已经取得了很好的成绩;我非常简单的windows程序占用了30%的CPU,显示了旋转的、无响应的光标,并且没有退出任务管理器的使用 由于本教程针对的是比我使用的版本(8)旧得多的windows版本,因此很可能我滥用了API。我想我很有可能 A) :忽略了要包含的重要文件 B) :利用 仍然可以使用但有缺陷的windows软件,或者 C) : 将API的一部分(WndProc,!done循环,可能?)编程错误,

我一直在学习windows/OpenGl编程的Cprogramming教程,到目前为止已经取得了很好的成绩;我非常简单的windows程序占用了30%的CPU,显示了旋转的、无响应的光标,并且没有退出任务管理器的使用

由于本教程针对的是比我使用的版本(8)旧得多的windows版本,因此很可能我滥用了API。我想我很有可能

  • A) :忽略了要包含的重要文件

  • B) :利用 仍然可以使用但有缺陷的windows软件,或者

  • C) : 将API的一部分(WndProc,!done循环,可能?)编程错误,以 使其行为不正常
我的程序代码与这个站点上的程序代码完全相同,减去了“stdafx.h”(我找不到这个头,这可能是我的问题),并添加了一些我自己编写的文件,这些文件描述了我正在开发的独立程序,它们本身运行良好

理想情况下,有人可以告诉我我的错误,或者windows 8的“正确”编程方式

编辑:以下是代码(感谢robin.koch(Getmessage()):

这就是为什么您有如此高的CPU负载。如果没有可用的消息,它不会阻塞,它只会返回false。因此,由于while循环,您正在一次又一次地调用此函数…请改用此函数

while(GetMessage(&msg, NULL, 0, 0))
  {
    if(!IsDialogMessage(hWnd, &msg))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }
这是我如何在当前项目中使用GetMessage()的示例。
另外,窗口进程中的
默认路径:
不应该只
中断
,而是调用

return DefWindowProc(hWnd, message, wParam, lParam);
这将确保默认函数处理您自己不处理的消息。有关详细信息,请参阅。 下面是如何编写窗口进程:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
        PAINTSTRUCT paintStruct;
        HDC hDC;
        char string[] = "Hello, world!";

        switch (message){

        case WM_CREATE:
                    break;
                // WM_CLOSE is used if we want to do something BEFORE the window is destroyed. WM_CLOSE is now handled by the DefWindowProc. We handle WM_DESTROY instead
                case WM_DESTROY:
                    PostQuitMessage(0); // here we are telling the message loop in WinMain to stop
                    return 0; // here we don't want the DefWindowProc to be called. So we return before it is called.
                    break;
                case WM_PAINT:
                    hDC = BeginPaint(hwnd, &paintStruct);

                    SetTextColor(hDC, COLORREF(0x00FF0000));//blue text

                    TextOut(hDC, 150, 150, string, sizeof(string) - 1);
                    EndPaint(hwnd, &paintStruct);

                    break;
        }//switch(message)
        // Always call the DefWindowProc
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
这就是为什么您有如此高的CPU负载。如果没有可用的消息,它不会阻塞,它只会返回false。因此,由于while循环,您正在一次又一次地调用此函数…请改用此函数

while(GetMessage(&msg, NULL, 0, 0))
  {
    if(!IsDialogMessage(hWnd, &msg))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }
这是我如何在当前项目中使用GetMessage()的示例。
另外,窗口进程中的
默认路径:
不应该只
中断
,而是调用

return DefWindowProc(hWnd, message, wParam, lParam);
这将确保默认函数处理您自己不处理的消息。有关详细信息,请参阅。 下面是如何编写窗口进程:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
        PAINTSTRUCT paintStruct;
        HDC hDC;
        char string[] = "Hello, world!";

        switch (message){

        case WM_CREATE:
                    break;
                // WM_CLOSE is used if we want to do something BEFORE the window is destroyed. WM_CLOSE is now handled by the DefWindowProc. We handle WM_DESTROY instead
                case WM_DESTROY:
                    PostQuitMessage(0); // here we are telling the message loop in WinMain to stop
                    return 0; // here we don't want the DefWindowProc to be called. So we return before it is called.
                    break;
                case WM_PAINT:
                    hDC = BeginPaint(hwnd, &paintStruct);

                    SetTextColor(hDC, COLORREF(0x00FF0000));//blue text

                    TextOut(hDC, 150, 150, string, sizeof(string) - 1);
                    EndPaint(hwnd, &paintStruct);

                    break;
        }//switch(message)
        // Always call the DefWindowProc
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
这就是为什么您有如此高的CPU负载。如果没有可用的消息,它不会阻塞,它只会返回false。因此,由于while循环,您正在一次又一次地调用此函数…请改用此函数

while(GetMessage(&msg, NULL, 0, 0))
  {
    if(!IsDialogMessage(hWnd, &msg))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }
这是我如何在当前项目中使用GetMessage()的示例。
另外,窗口进程中的
默认路径:
不应该只
中断
,而是调用

return DefWindowProc(hWnd, message, wParam, lParam);
这将确保默认函数处理您自己不处理的消息。有关详细信息,请参阅。 下面是如何编写窗口进程:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
        PAINTSTRUCT paintStruct;
        HDC hDC;
        char string[] = "Hello, world!";

        switch (message){

        case WM_CREATE:
                    break;
                // WM_CLOSE is used if we want to do something BEFORE the window is destroyed. WM_CLOSE is now handled by the DefWindowProc. We handle WM_DESTROY instead
                case WM_DESTROY:
                    PostQuitMessage(0); // here we are telling the message loop in WinMain to stop
                    return 0; // here we don't want the DefWindowProc to be called. So we return before it is called.
                    break;
                case WM_PAINT:
                    hDC = BeginPaint(hwnd, &paintStruct);

                    SetTextColor(hDC, COLORREF(0x00FF0000));//blue text

                    TextOut(hDC, 150, 150, string, sizeof(string) - 1);
                    EndPaint(hwnd, &paintStruct);

                    break;
        }//switch(message)
        // Always call the DefWindowProc
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
这就是为什么您有如此高的CPU负载。如果没有可用的消息,它不会阻塞,它只会返回false。因此,由于while循环,您正在一次又一次地调用此函数…请改用此函数

while(GetMessage(&msg, NULL, 0, 0))
  {
    if(!IsDialogMessage(hWnd, &msg))
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
  }
这是我如何在当前项目中使用GetMessage()的示例。
另外,窗口进程中的
默认路径:
不应该只
中断
,而是调用

return DefWindowProc(hWnd, message, wParam, lParam);
这将确保默认函数处理您自己不处理的消息。有关详细信息,请参阅。 下面是如何编写窗口进程:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
        PAINTSTRUCT paintStruct;
        HDC hDC;
        char string[] = "Hello, world!";

        switch (message){

        case WM_CREATE:
                    break;
                // WM_CLOSE is used if we want to do something BEFORE the window is destroyed. WM_CLOSE is now handled by the DefWindowProc. We handle WM_DESTROY instead
                case WM_DESTROY:
                    PostQuitMessage(0); // here we are telling the message loop in WinMain to stop
                    return 0; // here we don't want the DefWindowProc to be called. So we return before it is called.
                    break;
                case WM_PAINT:
                    hDC = BeginPaint(hwnd, &paintStruct);

                    SetTextColor(hDC, COLORREF(0x00FF0000));//blue text

                    TextOut(hDC, 150, 150, string, sizeof(string) - 1);
                    EndPaint(hwnd, &paintStruct);

                    break;
        }//switch(message)
        // Always call the DefWindowProc
        return DefWindowProc(hWnd, message, wParam, lParam);
    }


听起来这可能是消息循环中的问题。你能发布一些代码吗?STDAFX.H是Visual C++“预编译头”。。删除它不会引起问题,它只是一个加快编译速度的编译器选项。好吧,当你调试它时,它在哪里循环?我很困惑。这个问题没有PeekMessage循环,但答案说问题是PeekMessage循环。他在答案后发布了他的代码。他已经更新了它。原始代码可以可以看到他发布的链接。听起来这可能是你的消息循环的问题。你能发布一些代码吗?C++是“VisualC++”预编译头。。删除它不会引起问题,它只是一个加快编译速度的编译器选项。好吧,当你调试它时,它在哪里循环?我很困惑。这个问题没有PeekMessage循环,但答案说问题是PeekMessage循环。他在答案后发布了他的代码。他已经更新了它。原始代码可以可以看到他发布的链接。听起来这可能是你的消息循环的问题。你能发布一些代码吗?C++是“VisualC++”预编译头。。删除它不会引起问题,它只是一个加快编译速度的编译器选项。好吧,当你调试它时,它在哪里循环?我很困惑。这个问题没有PeekMessage循环,但答案说问题是PeekMessage循环。他在答案后发布了他的代码。他已经更新了它。原始代码可以可以看到他发布的链接。听起来这可能是你的消息循环的问题。你能发布一些代码吗?C++是“VisualC++”预编译头。。删除它不会引起问题,它只是一个加快编译速度的编译器选项。好吧,当你调试它时,它在哪里循环?我很困惑。这个问题没有PeekMessage循环,但答案说问题是PeekMessage循环。他在答案后发布了他的代码。他已经更新了它。原始代码可以下面是他发布的链接。哦,FFS,PeekMessage循环:(不过,一个浪费、消耗CPU、疯狂的PeekMessage()循环本身不应该导致“无响应”光标:(谢谢!效果很好;程序现在使用的资源大约为零。程序对输入仍然没有响应,我将发布代码。请参阅我更新的ans