Usuario: anónimo

Usuarios en línea: 1
Invitados: 1

FAQ

Mensaje

26m
Re: Duda con winapi
U(ruben) 2018-10-22 02:21:23  H

Buenas,

El bucle realmente lo puse como ejemplo para simplificar.

En este caso lo necesito para descargar registros de una API y en ciertos casos puede tardar horas dependiendo de la cantidad de registros.

Por eso mismo que dices pensé en simplemente poner un boleano en el WD_COMAND y meter todo en el main, pero el problema iba a ser el mismo ya que esté donde esté el "bucle", hasta acabarlo no se pasaría de ahí.

Lo que comenta Salvador de crear hilos es justo lo que necesitaba, poder realizar tareas diferentes simultáneamente.

Gracias por responder.

Un saludo

________________________________

De: Cconclase <cconclase-bounces@listas.conclase.net>  en nombre de Programacion Matematica <progmath13@gmail.com>

Enviado: domingo, 21 de octubre de 2018 16:52

Para: Lista de correo sobre C y C++

Asunto: Re: [C con Clase] Duda con winapi

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@hotmail.com<mailto:darkmalka@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@listas.conclase.net<mailto:Cconclase@listas.conclase.net>

http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net

Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

_______________________________________________

Lista de correo Cconclase Cconclase@listas.conclase.net

http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net

Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ