none
Problema con ProgressBar RRS feed

  • Pregunta

  • Hola gente, como estan? Ando con un problemita, a ver si alguno de ustedes me puede dar una mano.

    En resumen tengo una barra de progreso (ProgressBar) en un Form. Desde este Form llamo a algunos métodos que estan en otras clases que son las encargadas de aplicar ciertos algoritmos de exploracion y fuerza bruta, Backtracking y BnB.

    Como los algoritmos estos tienen siempre un costo elevado, quise agregar una barra de progreso al form para que mientras se este resolviendo el algoritmo, la barra del form se empieze a mover y cuando termine de resolverlo esta se detenga. Simplemente es para que no parezca que se muera la aplicacion x unos segundos mientras se ejecuta el algoritmo q esta en OTRA CLASE.

    El algoritmos se ejecuta con un boton simple, mi primer idea fue esta: (pseudo)

    void onCLick(...){
       
        comenzar a mover barra de progreso;
        llamar al metodo de reolucion que se encunetra en la clase BnB;
        detener barra de progreso;

    }

    Bueno esto definitivamente no anduvo, xq la verdad no se bien com funciona internametne, pero parece que las llamadas no son secuenciales.

    La barra de progreso simplemente es del tipo MARQUEE. no me interesa que muetre el porcentaje realizado, simplemente para q no parezca que la aplicacion murio.

    Bueno espero que se haya entendido... Espero su respuesta.. Muchas Gracias!!!!
    domingo, 30 de agosto de 2009 20:37

Respuestas

Todas las respuestas

  • Supongo que estarás hablando de C++/CLI, aunque el tema vale igual para C++ y Win32 o MFC...

    No puedes ocupar mucho tiempo de aplicación durante un evento o una función o el proceso de un mensaje. Si lo haces así bloquearás la aplicación, que es lo que te está paando.

    La mejor forma es que hagas ese proceso en un thread y vayas actualizando la UI, o en timer de WindowsForms o si no puedes, también puedes llamar a Application->DoEvents() dentro del bucle, pero esta es l peor forma de hacerlo.

    lunes, 7 de septiembre de 2009 11:06
    Moderador
  • Muchas Gracias por la respuesta...

    Como veras soy un novato en aplicaciones de Visual C++. Estuve investigando y intente crear un Thread, pero tuve varios inconvenientes, la verdad no se utilizarlos bien, logré ejecitar un proceso distinto pero daba como resultado un error en tiempo de ejecución el cual me decia que queria obtener acceso  aun elemento que no pertenecia al proceso. Pero la idea no es que te pongas a explicarme como se maneja esto, algun dia lo aprenderé... Mientras tanto voy a investigar la última opción que me diste, llamar a Application->DoEvents(), aunque no sea la mejor forma de hacerlo, si lo puedo solucionar por el momento me vendria barbaro.

    Muchas Gracias por tu tiempo!!
    lunes, 7 de septiembre de 2009 16:50
  • Si te dice que no puede acceder a una variable desde otro proceso casi seguro que se debe a que estás actualizando la barra de progreso desde el hilo secundario, y eso no se puede hacer. Tienes que hacerlo desde una llamada al Inkoke de la ficha.

    Oye, dentro de unos días voy a dar un webcast sobre hilos en .NET desde cero. Aunque es para C#, te valdría igual para C++/CLI.

    La asistencia es gratuita y se hace a través de internet: http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032424886&EventCategory=4&culture=es-ES&CountryCode=ES

    lunes, 7 de septiembre de 2009 18:58
    Moderador
  • Haaa... ok! no entendi mucho lo que dijiste, x ese motivo no me vendria nada mal el webcast, conta conmigo que ahi voy a estar... Mientras tanto te cuento que no lo pude solucionar con Application->DoEvents() xq empieza a correr la barra pero se detiene cuando llama al metodo que te contaba que tardaba bastante. Asi que la solución esta en crear bien el subproceso. Bueno espero que no sea muy complicado el tema de los Threads. Otra vez muchas gracias...
    lunes, 7 de septiembre de 2009 19:07
  • Pues entonces si ese método no tiene un bucle en el que puedas poner el DoEvents() tienes que hacerlo con hilo por narices.

    Con lo del Invoke me refería a que usaras el método Invoke para ejecutar un delegado que es el actualice la barra de progreso. Algo así:

    public delegate void ActualizaProgressDelegate(int valor);

    void ActualizaProgress(int valor)
    {
       //Actualizar el progress
    }

    Invoke(gcnew ActualizaProgressDelegate(ActualizaProgress), gcnew object[] {iNuevoValor});

    Todo ello formando parte de la ficha excepto la declaración primera del delegado y en donde iNuevoValor es un entero que contiene el nuevo valor.

    Parece más compilcado de lo que realmente es. Busca algo sobre delegados y lo entenderás.

    http://msdn.microsoft.com/es-es/library/bb972282.aspx
    http://www.elguille.info/NET/dotnet/firmas_harvey_AplicandoDelegados_DotNET.htm

    Y esto de mi blog que lo mismo te sirve:
    http://geeks.ms/blogs/rfog/archive/2007/10/17/c-cli-vi-delegados-e-hilos.aspx

    • Marcado como respuesta FranKoLVP lunes, 7 de septiembre de 2009 19:19
    lunes, 7 de septiembre de 2009 19:16
    Moderador
  • MIL GRACIAS!!!

    Ya mismo me pongo a investigar esto... tenes razon, parece muuuy complicado jeje.. pero creo que es importante saberlo.

    Luego te comento como me fue.. Gracias x tu tiempo!!
    lunes, 7 de septiembre de 2009 19:19