<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;font-family:Calibri,Helvetica,sans-serif;" dir="ltr">
<p style="margin-top:0;margin-bottom:0">Buenas,</p>
<p style="margin-top:0;margin-bottom:0">Estoy aprendiendo a usar winapi con el curso de cconclase y es realmente bueno. </p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">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.</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">El caso es que si activo un bucle con WM_COMAND, la aplicación se cuelga hasta que el bucle finalice.</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">Como tendría que hacer para ejecutar un bucle/funcion que tarde 10 minutos por ejemplo sin que deje de responder la aplicación? <span style="font-size: 12pt;">El ejemplo 4 del curso es
</span><span style="font-size: 12pt;">perfecto para mostrar </span><span style="font-size: 12pt;">lo que yo he hecho (está marcado en rojo).</span></p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0">Para solucionarlo he pensado en activar un boleano con <span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">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.</span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><br>
</span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">Muchas gracias por vuestro
 tiempo.</span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><br>
</span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">Un saludo</span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><br>
</span></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"><br>
</span></p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0"></p>
<div>#include <windows.h></div>
<div>#include <stdio.h></div>
<div>#include "main.h"</div>
<div><br>
</div>
<div>/*  Declaración del procedimiento de ventana  */</div>
<div>LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);</div>
<div>BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);</div>
<div>BOOL CALLBACK DlgProc2(HWND, UINT, WPARAM, LPARAM);</div>
<div><br>
</div>
<div>int WINAPI WinMain (HINSTANCE hThisInstance,</div>
<div>                    HINSTANCE hPrevInstance,</div>
<div>                    LPSTR lpszArgument,</div>
<div>                    int nFunsterStil)</div>
<div>{</div>
<div>    HWND hwnd;               /* Manipulador de ventana */</div>
<div>    MSG mensaje;             /* Mensajes recibidos por la aplicación */</div>
<div>    WNDCLASSEX wincl;        /* Estructura de datos para la clase de ventana */</div>
<div><br>
</div>
<div>    /* Estructura de la ventana */</div>
<div>    wincl.hInstance = hThisInstance;</div>
<div>    wincl.lpszClassName = "NUESTRA_CLASE";</div>
<div>    wincl.lpfnWndProc = WindowProcedure;      /* Esta función es invocada por Windows */</div>
<div>    wincl.style = CS_DBLCLKS;                 /* Captura los doble-clicks */</div>
<div>    wincl.cbSize = sizeof (WNDCLASSEX);</div>
<div><br>
</div>
<div>    /* Usar icono y puntero por defector */</div>
<div>    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);</div>
<div>    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);</div>
<div>    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);</div>
<div>    wincl.lpszMenuName = "Menu";</div>
<div>    wincl.cbClsExtra = 0;                      /* Sin información adicional para la */</div>
<div>    wincl.cbWndExtra = 0;                      /* clase o la ventana */</div>
<div>    /* Usar el color de fondo por defecto para la ventana */</div>
<div>    wincl.hbrBackground = GetSysColorBrush(COLOR_BACKGROUND);</div>
<div><br>
</div>
<div>    /* Registrar la clase de ventana, si falla, salir del programa */</div>
<div>    if(!RegisterClassEx(&wincl)) return 0;</div>
<div><br>
</div>
<div>    /* La clase está registrada, crear la ventana */</div>
<div>    hwnd = CreateWindowEx(</div>
<div>           0,                   /* Posibilidades de variación */</div>
<div>           "NUESTRA_CLASE",     /* Nombre de la clase */</div>
<div>           "Ejemplo 004",       /* Texto del título */</div>
<div>           WS_OVERLAPPEDWINDOW, /* Tipo por defecto */</div>
<div>           CW_USEDEFAULT,       /* Windows decide la posición */</div>
<div>           CW_USEDEFAULT,       /* donde se coloca la ventana */</div>
<div>           544,                 /* Ancho */</div>
<div>           375,                 /* Alto en pixels */</div>
<div>           HWND_DESKTOP,        /* La ventana es hija del escritorio */</div>
<div>           NULL,                /* Sin menú */</div>
<div>           hThisInstance,       /* Manipulador de instancia */</div>
<div>           NULL                 /* No hay datos de creación de ventana */</div>
<div>    );</div>
<div><br>
</div>
<div>    /* Mostrar la ventana */</div>
<div>    ShowWindow(hwnd, SW_SHOWDEFAULT);</div>
<div><br>
</div>
<div>    /* Bucle de mensajes, se ejecuta hasta que haya error o GetMessage devuelva FALSE */</div>
<div>    while(TRUE == GetMessage(&mensaje, NULL, 0, 0))</div>
<div>    {</div>
<div>        /* Traducir mensajes de teclas virtuales a mensajes de caracteres */</div>
<div>        TranslateMessage(&mensaje);</div>
<div>        /* Enviar mensaje al procedimiento de ventana */</div>
<div>        DispatchMessage(&mensaje);</div>
<div>    }</div>
<div><br>
</div>
<div>    /* Salir con valor de retorno */</div>
<div>    return mensaje.wParam;</div>
<div>}</div>
<div><br>
</div>
<div><br>
</div>
<div>/*  Esta función es invocada por la función DispatchMessage()  */</div>
<div>LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)</div>
<div>{</div>
<div>    static HINSTANCE hInstance;</div>
<div>    static int veces;</div>
<div><br>
</div>
<div>    switch (msg)                  /* manipulador del mensaje */</div>
<div>    {</div>
<div>        case WM_CREATE:</div>
<div>           hInstance = ((LPCREATESTRUCT)lParam)->hInstance;</div>
<div>           return 0;</div>
<div>           break;</div>
<div>        case WM_COMMAND:</div>
<div>           switch(LOWORD(wParam)) {</div>
<div><br>
</div>
<div></div>
<div>              case CM_DIALOGO2:</div>
<div><span style="color: rgb(255, 0, 0);">                 //bucle</span></div>
<div><span style="color: rgb(255, 0, 0);"></span></div>
<div>                 DialogBoxParam(hInstance, "DialogoPrueba", hwnd, DlgProc2, veces);</div>
<div>                 break;</div>
<div>           }</div>
<div>           break;</div>
<div>        case WM_DESTROY:</div>
<div>           PostQuitMessage(0);    /* envía un mensaje WM_QUIT a la cola de mensajes */</div>
<div>           break;</div>
<div>        default:                  /* para los mensajes de los que no nos ocupamos */</div>
<div>           return DefWindowProc(hwnd, msg, wParam, lParam);</div>
<div>    }</div>
<div>    return 0;</div>
<div>}</div>
<div></div>
<div><br>
</div>
<div>BOOL CALLBACK DlgProc2(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)</div>
<div>{</div>
<div>    char texto[25];</div>
<div><br>
</div>
<div>    switch (msg)                  /* manipulador del mensaje */</div>
<div>    {</div>
<div>        case WM_INITDIALOG:</div>
<div>           sprintf(texto, "Veces invocado: %d", (int)lParam);</div>
<div>           SetWindowText(GetDlgItem(hDlg, TEXTO), texto);</div>
<div>           return TRUE;</div>
<div>        case WM_COMMAND:</div>
<div>           EndDialog(hDlg, FALSE);</div>
<div>           return TRUE;</div>
<div>    }</div>
<div>    return FALSE;</div>
<div>}</div>
<br>
<p></p>
<p style="margin-top:0;margin-bottom:0"><span style="font-family: Calibri, Helvetica, sans-serif, EmojiFont, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;"></span></p>
</div>
</body>
</html>