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