[C con Clase] Duda con winapi
Programacion Matematica
progmath13 en gmail.com
Dom Oct 21 16:52:46 CEST 2018
Es normal que se cuelgue hasta que el bucle finalice si lo haces de esa
forma. Al ejecutarse el COMMAND y entrar en el bucle, mientras se esté
ejecutando no podrá avanzar al break del COMMAND.
Que es lo que necesitas hacer con bucle?
El dom., 21 de oct. de 2018 8:28 AM, Rubén Blanco Fernández <
darkmalka en hotmail.com> escribió:
> Buenas,
>
> Estoy aprendiendo a usar winapi con el curso de cconclase y es realmente
> bueno.
>
>
> Se me a presentado un problema que no tengo claro como gestionarlo. Estoy
> acostumbrado a programar en consola y cuando quieres hacer un bucle que
> tarde su tiempo, simplemente hay que esperar a que termine.
>
>
> El caso es que si activo un bucle con WM_COMAND, la aplicación se cuelga
> hasta que el bucle finalice.
>
>
> Como tendría que hacer para ejecutar un bucle/funcion que tarde 10 minutos
> por ejemplo sin que deje de responder la aplicación? El ejemplo 4 del
> curso es perfecto para mostrar lo que yo he hecho (está marcado en rojo).
>
>
> Para solucionarlo he pensado en activar un boleano con WM_COMAND y
> después ejecutar el bucle en otro sitio, e incluso segmentar el bucle para
> que valla funcionando poco a poco, pero creo esto simplemente camufla el
> problema. No se si hay una solución más obvia para esto.
>
>
> Muchas gracias por vuestro tiempo.
>
>
> Un saludo
>
>
>
>
> #include <windows.h>
> #include <stdio.h>
> #include "main.h"
>
> /* Declaración del procedimiento de ventana */
> LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
> BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
> BOOL CALLBACK DlgProc2(HWND, UINT, WPARAM, LPARAM);
>
> int WINAPI WinMain (HINSTANCE hThisInstance,
> HINSTANCE hPrevInstance,
> LPSTR lpszArgument,
> int nFunsterStil)
> {
> HWND hwnd; /* Manipulador de ventana */
> MSG mensaje; /* Mensajes recibidos por la aplicación */
> WNDCLASSEX wincl; /* Estructura de datos para la clase de
> ventana */
>
> /* Estructura de la ventana */
> wincl.hInstance = hThisInstance;
> wincl.lpszClassName = "NUESTRA_CLASE";
> wincl.lpfnWndProc = WindowProcedure; /* Esta función es invocada
> por Windows */
> wincl.style = CS_DBLCLKS; /* Captura los doble-clicks
> */
> wincl.cbSize = sizeof (WNDCLASSEX);
>
> /* Usar icono y puntero por defector */
> wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
> wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
> wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
> wincl.lpszMenuName = "Menu";
> wincl.cbClsExtra = 0; /* Sin información
> adicional para la */
> wincl.cbWndExtra = 0; /* clase o la ventana */
> /* Usar el color de fondo por defecto para la ventana */
> wincl.hbrBackground = GetSysColorBrush(COLOR_BACKGROUND);
>
> /* Registrar la clase de ventana, si falla, salir del programa */
> if(!RegisterClassEx(&wincl)) return 0;
>
> /* La clase está registrada, crear la ventana */
> hwnd = CreateWindowEx(
> 0, /* Posibilidades de variación */
> "NUESTRA_CLASE", /* Nombre de la clase */
> "Ejemplo 004", /* Texto del título */
> WS_OVERLAPPEDWINDOW, /* Tipo por defecto */
> CW_USEDEFAULT, /* Windows decide la posición */
> CW_USEDEFAULT, /* donde se coloca la ventana */
> 544, /* Ancho */
> 375, /* Alto en pixels */
> HWND_DESKTOP, /* La ventana es hija del escritorio */
> NULL, /* Sin menú */
> hThisInstance, /* Manipulador de instancia */
> NULL /* No hay datos de creación de ventana */
> );
>
> /* Mostrar la ventana */
> ShowWindow(hwnd, SW_SHOWDEFAULT);
>
> /* Bucle de mensajes, se ejecuta hasta que haya error o GetMessage
> devuelva FALSE */
> while(TRUE == GetMessage(&mensaje, NULL, 0, 0))
> {
> /* Traducir mensajes de teclas virtuales a mensajes de caracteres
> */
> TranslateMessage(&mensaje);
> /* Enviar mensaje al procedimiento de ventana */
> DispatchMessage(&mensaje);
> }
>
> /* Salir con valor de retorno */
> return mensaje.wParam;
> }
>
>
> /* Esta función es invocada por la función DispatchMessage() */
> LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam,
> LPARAM lParam)
> {
> static HINSTANCE hInstance;
> static int veces;
>
> switch (msg) /* manipulador del mensaje */
> {
> case WM_CREATE:
> hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
> return 0;
> break;
> case WM_COMMAND:
> switch(LOWORD(wParam)) {
>
> case CM_DIALOGO2:
> //bucle
> DialogBoxParam(hInstance, "DialogoPrueba", hwnd,
> DlgProc2, veces);
> break;
> }
> break;
> case WM_DESTROY:
> PostQuitMessage(0); /* envía un mensaje WM_QUIT a la cola de
> mensajes */
> break;
> default: /* para los mensajes de los que no nos
> ocupamos */
> return DefWindowProc(hwnd, msg, wParam, lParam);
> }
> return 0;
> }
>
> BOOL CALLBACK DlgProc2(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
> {
> char texto[25];
>
> switch (msg) /* manipulador del mensaje */
> {
> case WM_INITDIALOG:
> sprintf(texto, "Veces invocado: %d", (int)lParam);
> SetWindowText(GetDlgItem(hDlg, TEXTO), texto);
> return TRUE;
> case WM_COMMAND:
> EndDialog(hDlg, FALSE);
> return TRUE;
> }
> return FALSE;
> }
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20181021/f55a1297/attachment.html>
Más información sobre la lista de distribución Cconclase