Autor
|
Tema: Sobre carga de la CPU, valor incorrecto en EAX? (Leído 5,203 veces)
|
x64core
Desconectado
Mensajes: 1.908
|
hola gente, bueno hice este codigo y trabaja exactamente como yo quiero que haga, el problema es que la CPU se sobrecarga, llega al 50% cuando posiciono el cursor sobre un control creado y no encuentro del PORQUE lo hace : P por favor ayuda! ya revise la documentacion y devuelvo los valores que pide : P depurara el programa si supiera que hay un error pero el programa no se cuelga ni nada, al parece esta mal estructurado , gracias! .386 .model flat,stdcall option casemap:none include \masm32\include\masm32rt.inc myWNDPROC proto :HWND,:UINT,:WPARAM,:LPARAM WndProc proto :HWND,:UINT,:WPARAM,:LPARAM WinMain proto :DWORD,:DWORD .data ClassName db "mypaint",0 AppName db "paint program",0 myclass db "Static",0 sname db "statictohide",0 sname2 db "statictohide2",0 hstatic dd 0 hstatic2 dd 0 mysubclass dd 0 returnclass dd 0 .data? hInstance HINSTANCE ? .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke WinMain, hInstance,NULL invoke ExitProcess,eax WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE 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_BTNFACE+1 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,SW_SHOWNORMAL invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp myWNDPROC proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL LEAVEAREA:TRACKMOUSEEVENT .if uMsg==WM_MOUSEMOVE invoke ShowWindow,hWnd,SW_HIDE mov edx,hWnd mov LEAVEAREA.cbSize,sizeof(TRACKMOUSEEVENT) mov LEAVEAREA.dwFlags,TME_HOVER or TME_LEAVE mov LEAVEAREA.dwHoverTime,1000 mov LEAVEAREA.hwndTrack,edx invoke TrackMouseEvent,addr LEAVEAREA .elseif uMsg==WM_MOUSELEAVE invoke ShowWindow,hWnd,SW_SHOW .else invoke CallWindowProc,mysubclass,hWnd,uMsg,wParam,lParam ret .endif xor eax,eax ret myWNDPROC endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL LEAVEAREA:TRACKMOUSEEVENT .IF uMsg==WM_DESTROY invoke SetWindowLong,mysubclass,GWL_WNDPROC,myWNDPROC invoke PostQuitMessage,NULL .ELSEIF uMsg==WM_CREATE invoke CreateWindowEx,NULL,addr myclass,addr sname,WS_VISIBLE or WS_CHILD or SS_NOTIFY, \ 0h,0h,50h,50h,hWnd,NULL,hInstance,NULL mov hstatic,eax ; save hanlde static control invoke CreateWindowEx,NULL,addr myclass,addr sname2,WS_VISIBLE or WS_CHILD or SS_NOTIFY, \ 60h,0h,50h,50h,hWnd,NULL,hInstance,NULL mov hstatic2,eax invoke SetWindowLong,hstatic,GWL_WNDPROC,myWNDPROC invoke SetWindowLong,hstatic2,GWL_WNDPROC,myWNDPROC mov mysubclass,eax .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start
|
|
|
En línea
|
|
|
|
_Enko
|
.else invoke CallWindowProc,mysubclass,hWnd,uMsg,wParam,lParam ret .endif xor eax,eax ret myWNDPROC endp
No estoy seguro, pero ahi por lo visto llamas al WndProc de mysubclass, cuando ya estas dentro del wndProc de mysubclass. Es decir, RECURSIVIDAD. Luego creas una Ventana de la clase mysubclass que jamas registras antes. Creo que estas confundiendo dos conceptos, SUPERCLASING y SUBCLASING aunque en realidad no necesitas de ninguno de los dos. invoke SetWindowLong,hstatic,GWL_WNDPROC,myWNDPROC Lo digo mas que nada por esa linea. Si estas tratando de crear "componentes" personalizados como por ejemplo un selector de colores, te conviene empezar con una clase desde cero.
|
|
« Última modificación: 21 Abril 2012, 15:57 pm por _Enko »
|
En línea
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
bueno laverdad e probado de todo usando DefWindowProc, CallwindowProc, diferentes resultados en EAX, y nada lo curioso en que solo cuando llamo a ShoWindow sucede eso, si te fijas Enko si borras la linea de ShowWindow el programa corre normal : P estuve como 2 dias enteros probando de todo :S
|
|
|
En línea
|
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
me parece que ya lo habia hecho, y no funciono, y lo e vuelto a hacer y no funciona :@ siempre se sobre carga la CPU
|
|
|
En línea
|
|
|
|
$Edu$
Desconectado
Mensajes: 1.842
|
Hablo casi sin saber, pero.. porque no debuggeas para ver si no se convierte en Recursividad como dice _Enko? ahi le encontraras el fallo, tal vez no donde dice _Enko, pero tal vez en otro lado. Debuggeando le encontras la solucion facil, no es mucho codigo.
|
|
|
En línea
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
Hablo casi sin saber, pero.. porque no debuggeas para ver si no se convierte en Recursividad como dice _Enko? ahi le encontraras el fallo, tal vez no donde dice _Enko, pero tal vez en otro lado. Debuggeando le encontras la solucion facil, no es mucho codigo.
no puede ser porque si elimino la linea de ShowWindow como e dicho el código funciona correctamente, seguramente hay algo malo con los dos ShowWindow
|
|
|
En línea
|
|
|
|
_Enko
|
Tambien esta mal que no llames los WindowProc originales de las ventanas si haces subclassing.
Lee el ejemplo de subclasing de iczelion, intenta reproducirlo, luego aplicalo a tu problema.
Si haces un componente nuevo, tienes que registrar la clase.
|
|
« Última modificación: 21 Abril 2012, 23:58 pm por _Enko »
|
En línea
|
|
|
|
x64core
Desconectado
Mensajes: 1.908
|
Enko me e leido todos los tutos de iczelion : P de hecho hasta los codigos de la MSDN esta así muestra como un subclassing http://msdn.microsoft.com/en-us/library/windows/desktop/ms633570(v=vs.85).aspx Un amigo logro resolver en problema pero usaba una y mil APIs : P bueno no es eso en si, a mi lo que no llego a aceptar es porque no funciona como los demas, de hecho si quiero capturar botones, estatico, listview, etc me funciona correctamente
|
|
|
En línea
|
|
|
|
_Enko
|
citas MSDN, pero lo que estas citando es registro de clases nuevas con su windproc propio. En tu ejemplo solo registras un componente, la ventana principal. Insisto, no confundas clase de ventana nueva, con un subclassing.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Contadores de Visitas, sobre carga :p
Nivel Web
|
Castg!
|
1
|
2,586
|
28 Enero 2010, 08:39 am
por jdc
|
|
|
sobre carga de metodos parte2
Java
|
Rijhording
|
1
|
2,303
|
27 Abril 2010, 07:26 am
por monsefoster
|
|
|
Posicionamiento incorrecto en IE y Chrome
« 1 2 »
Desarrollo Web
|
Riki_89D
|
13
|
6,656
|
13 Noviembre 2010, 02:08 am
por Nakp
|
|
|
Sobre carga de operador [Visual Studio 2010]
Programación C/C++
|
Namida
|
6
|
5,006
|
17 Diciembre 2010, 09:40 am
por Namida
|
|
|
Duda sobre mysql; ¿Se puede conocer el valor de un campo luego de insertarlo?
Bases de Datos
|
astinx
|
2
|
2,794
|
10 Marzo 2012, 15:53 pm
por astinx
|
|