<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>