程序占用CPU资源的问题

pankun 2003-04-09 10:06:51
我写了一个程序用于生成一个窗口,程序执行以前CPU的占用率为13%左右,执行后就达到100%了!不会吧!我只是生成了一个简单的窗体而已,程序如下
;###############################################################
.386
.model flat, stdcall
option casemap:none

;############################################################

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

;###############################################################

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

;###############################################################
.data
ClassName db 'MyWndClass',0
AppName db 'NewWindow',0
char WPARAM 20H
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hdc HDC ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax

;##########################################################################

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND

mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL
mov hwnd, eax
invoke ShowWindow, hwnd, CmdShow
invoke UpdateWindow, hwnd
invoke GetDC, hwnd
mov hdc, eax

FMessage:
invoke GetMessage, addr msg, NULL, 0, 0
cmp eax, 0
jz EndMessage
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp FMessage
EndMessage:
mov eax, msg.wParam
ret
WinMain endp

;########################################################################

WndProc proc hwnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL BitBmp:HBITMAP
.IF uMsg==WM_DESTROY
invoke PostQuitMessage, NULL
.ELSEIF uMsg==WM_CHAR
push wParam
pop char
invoke SendMessage, hwnd, WM_PAINT, 0, 0
.ELSEIF uMsg==WM_PAINT
invoke LoadBitmap, NULL, OBM_COMBO
mov BitBmp, eax
invoke BitBlt, hdc, 50, 50, 32, 32, BitBmp, 0, 0, SRCCOPY
invoke TextOut, hdc, 0, 0,addr char, 1
.ELSE
invoke DefWindowProc, hwnd, uMsg, wParam, lParam
ret
.ENDIF
xor eax, eax
ret
WndProc endp

end start

大侠们告诉我一下原因啊,谢谢
...全文
39 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
pankun 2003-04-11
  • 打赏
  • 举报
回复
果然是hdc的问题,但为什么会这样我还不清楚,谢谢zara兄和shore兄弟的热心帮助,我结贴了.
pankun 2003-04-10
  • 打赏
  • 举报
回复
我把LoadBitmap这一段去掉了也是一样的占用100%的资源啊。
真奇怪。
zara 2003-04-10
  • 打赏
  • 举报
回复
我觉得楼主对 hdc 的使用是错误的. hdc 应该是在 WM_PAINT 消息处理中通过 BeginPaint 函数来获取, 并且在消息处理完成后通过 EndPaint 函数进行释放; 而不应该是在创建窗口后用 GetDC 来获取, 并在后面的 WM_PAINT 消息处理时使用. 导致 CPU 100% 的占用, 可能是由于没有使用 BeginPaint-EndPaint 函数对清除消息队列中的带更新区域, 导致一直在不停地发送 WM_PAINT 消息造成的. 建议楼主, 先不管 hdc 的使用方法, 在 WM_PAINT 消息处理中加入 BeginPaint-EndPaint 函数对, 再看看运行的状况.
shore 2003-04-09
  • 打赏
  • 举报
回复
看看你WM_PAINT事件中的LoadBitmap

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧