| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1832 人关注过本帖
标题:关于建立一个窗体运行后CPU占用很高的问题
只看楼主 加入收藏
devil_鸢
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-12-12
收藏
 问题点数:0 回复次数:5 
关于建立一个窗体运行后CPU占用很高的问题
这个是窗体的全部代码

#include"windows.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL InitstanceClass(HINSTANCE);
BOOL Initstance(HINSTANCE,int);
HWND hwnd;
HINSTANCE hInstance;

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    MSG msg;
    if (!InitstanceClass(hInstance))
    {
        MessageBox(hwnd,"EROOR!",0,MB_OK);
        return FALSE;
    }

    if (!Initstance(hInstance,nShowCmd))
    {
        return FALSE;
    }

    while (GetMessage(&msg,hwnd,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (msg.wParam);
}

BOOL InitstanceClass(HINSTANCE hInstance)
{
    WNDCLASS wndclass;
    char a[]="FORM";
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;
    wndclass.hbrBackground=HBRUSH(GetStockObject(BLACK_BRUSH));
    wndclass.hCursor=LoadCursor(hInstance,IDC_ARROW);
    wndclass.hIcon=LoadIcon(hInstance,IDI_APPLICATION);
    wndclass.hInstance=hInstance;
    wndclass.lpfnWndProc=(WNDPROC)WndProc;
    wndclass.lpszClassName="a";
    wndclass.lpszMenuName=NULL;
    wndclass.style=0;

    return RegisterClass(&wndclass);
}

BOOL Initstance(HINSTANCE hInstance,int nShowCmd)
{
    hwnd=CreateWindow("a","FORM",WS_OVERLAPPEDWINDOW,200,400,400,200,NULL,NULL,hInstance,NULL);
    if (hwnd)
    {
        ShowWindow(hwnd,nShowCmd);
        UpdateWindow(hwnd);
    }
    return TRUE;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hDc;
    //HPEN hPen;
    //HBRUSH hBrush;

    switch(message)
    {
    case WM_LBUTTONDOWN:
        hDc=GetDC(hwnd);
        SetTextColor(hDc,RGB(44,125,35));
        SetBkColor(hDc,RGB(0,255,0));
        TextOut(hDc,100,100,"I`am alarght!",strlen("I`am alarght!"));    
        ReleaseDC(hwnd,hDc);

    case WM_PAINT:
        hDc=GetDC(hwnd);
        SetPixel(hDc,20,30,RGB(44,63,160));
        LineTo(hDc,40,60);
        Rectangle(hDc,100,200,70,80);
        //SetTextColor(hDc,RGB(44,125,35));
        //SetBkColor(hDc,RGB(0,255,0));
        //TextOut(hDc,100,100,"I`am alarght!",strlen("I`am alarght!"));    
        ReleaseDC(hwnd,hDc);
        break;
    case WM_DESTROY:PostQuitMessage(0);break;
    default:return(DefWindowProc(hwnd,message,wParam,lParam));
    }
}

我想请教为什么这个窗体运行后会占用很高的CPU资源,是不是哪里没有正确结束掉,还有就是default:return(DefWindowProc(hwnd,message,wParam,lParam));这里提示有个Warning,是什么问题!
搜索更多相关主题的帖子: CPU 窗体 运行 
2007-12-12 10:34
圆圆的鸟蛋
Rank: 1
等 级:新手上路
帖 子:216
专家分:0
注 册:2007-4-22
收藏
得分:0 
没看出什么大问题,,只有点小问题。。
1、
wndclass.hCursor=LoadCursor(hInstance,IDC_ARROW);
wndclass.hIcon=LoadIcon(hInstance,IDI_APPLICATION);
如果是使用系统图标的话,LoadXXXX函数的第一个参数可以是NULL。。

2、
BOOL Initstance(HINSTANCE hInstance,int nShowCmd)
{
    hwnd=CreateWindow("a","FORM",WS_OVERLAPPEDWINDOW,200,400,400,200,NULL,NULL,hInstance,NULL);
    if (hwnd)
    {
        ShowWindow(hwnd,nShowCmd);
        UpdateWindow(hwnd);
    }
    return TRUE;
}
这个函数无论创建窗口是否成功,都返回TRUE。。

3、
 while (GetMessage(&msg,hwnd,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
GetMessage的第二个参数不能是hwnd,而应该是NULL。。具体原因可以查一查MSDN。。这个可能是造成CPU占用率高的原因。。

那个Warning估计是因为WndProc函数需要返回值。。。

愚见啊

鸟蛋开始孵化。。。我等待那一天Forever。。
2007-12-12 10:52
devil_鸢
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-12-12
收藏
得分:0 
恩!按照楼上响应的提示改正了,错误少了不少,但是CPU还是一直占用很高,不明白为什么,望各位指点!
2007-12-13 10:52
圆圆的鸟蛋
Rank: 1
等 级:新手上路
帖 子:216
专家分:0
注 册:2007-4-22
收藏
得分:0 
还有一个地方忘了说了:
case WM_LBUTTONDOWN:
        hDc=GetDC(hwnd);
        SetTextColor(hDc,RGB(44,125,35));
        SetBkColor(hDc,RGB(0,255,0));
        TextOut(hDc,100,100,"I`am alarght!",strlen("I`am alarght!"));   
        ReleaseDC(hwnd,hDc);
这里差了一个break

鸟蛋开始孵化。。。我等待那一天Forever。。
2007-12-13 14:19
ldcsoftware
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2007-8-6
收藏
得分:0 
问题在这里:
while (GetMessage(&msg,hwnd,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

GetMessage(&msg,hwnd,0,0)

当你单击关闭窗口的时候! hwnd  已经不存在了  GetMessage()返回 -1  为真!!!
就进入死循环!!!CPU暂用率就搞了!!!
2007-12-13 18:03
devil_鸢
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-12-12
收藏
得分:0 
恩,谢谢各位的帮助,虽然还是占用很高的CPU资源,但是解决了很多程序上的错误!
2007-12-17 12:24
快速回复:关于建立一个窗体运行后CPU占用很高的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024233 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved