none
Poner una imágen de espera en la carga.... RRS feed

  • Pregunta

  •  

    Hola compañeros.

    Veréis, os quiero plantear una duda a ver qué soluciones me podéis dar.

     

    Mi aplicación Window creada con Visual Studio 2005 y bv en algunos formularios tarde dos segundos y medio o cosa así en cargar.

    Durante ese tiempo, deja un poco "colgado" los dibujos de paneles etc etc, y para que eso no quede tan feo, quiero meter un reloj de arena gif, que tiene movimiento, para mientras se carga el formulario esté girando. ¿Sabéis como lograr ésto? De momento no lo logro y me vendría bien alguana ayuda.

    Gracias Wink

    lunes, 29 de octubre de 2007 15:17

Todas las respuestas

  • Has probado con un gif animado en una picturebox?

     

    Salud y suerte!

     

    lunes, 29 de octubre de 2007 15:31
    Moderador
  •  Toni Recio Escribió:

    Has probado con un gif animado en una picturebox?

     

    Salud y suerte!

     

     

    Si claro. Lo que ocurre es que no es activa hasta que se activa el resto de elementos, y lo que quiero evitar es precisamente esos dos segundos y medio donde están pintados los controles, pero aún no se han cargado los datos sobre ellos. Me explico bien??

    lunes, 29 de octubre de 2007 16:14
  • Te explicas perfectamente.

     

    Quizás usando elcomponente BackGroundWorker?

    http://msdn2.microsoft.com/es-es/library/c8dcext2(VS.80).aspx

     

    Como lo ves?

    lunes, 29 de octubre de 2007 16:18
    Moderador
  •  Toni Recio Escribió:

    Te explicas perfectamente.

     

    Quizás usando elcomponente BackGroundWorker?

    http://msdn2.microsoft.com/es-es/library/c8dcext2(VS.80).aspx

     

    Como lo ves?

     

    Gracias, voy a ver qué puedo hacer con ésto  y te cuento Wink

    lunes, 29 de octubre de 2007 16:46
  • Estaré atento...

     

    lunes, 29 de octubre de 2007 16:59
    Moderador
  •  

    Pues ya está pero no consigo hacerlo funcionar bien ya que me saca una excepción que no soy capaz de evitar.

     

    Veréis, lo que he hecho ha sido crear un control BackgroundWorker.

    Luego en el evento load d emi formulario tenía una serie de procesos que carga todos los datos del formulario como varios combos, etc etc. Quito ese código del "load" y lo pongo en el evento DoWork del BackgroundWorker.

     

    Luego en el load hago grande la imágen del reloj para que aparezca y pongo en marcha el funcionamiento del proceso asincrónomo del BackGroudWorder

     

    Bloque de código

    RelojArena1.Width = Screen.PrimaryScreen.WorkingArea.Width

    RelojArena1.Height = Screen.PrimaryScreen.WorkingArea.Height

    BackgroundWorker1.RunWorkerAsync()

     

     

    Sin embargo, el relos aparece sin problemas, el código que carga los datos se comienza a ejecutar con normalidad, poro entonces me da una excepción. Concretamente:

     

    "Operación no válida a través de subprocesos: Se tuvo acceso al control 'TextCliente' desde un subproceso distinto a aquel en que lo creó."

     

    Alguna idea de por qué ocurre ésto???

     

     

    martes, 30 de octubre de 2007 12:43
  • Aquí tienes un par de enlaces que tratan tu situación:

    http://msdn2.microsoft.com/es-es/library/ms171843(VS.80).aspx

    http://msdn2.microsoft.com/es-es/library/ms171728(VS.80).aspx

     

    Espero que te sirvan.

     

    Salud y suerte!

     

    martes, 30 de octubre de 2007 14:30
    Moderador
  • Listo y arreglado.

    Puese en el load antes de nada la propieadad

     

    CheckForIllegalCrossThreadCalls = False

     

    Y ya todo funcniona peféctamente y no salta ese error. Pero no tendrá nada de malo tener esa propiedad así???

     

    martes, 30 de octubre de 2007 15:04
  •  Javichechu Escribió:

    Y ya todo funcniona peféctamente y no salta ese error. Pero no tendrá nada de malo tener esa propiedad así???

     

    Sin problemas...

    martes, 30 de octubre de 2007 15:10
    Moderador
  • Pues parece ser que no es tan sencillo.

     

    La aplicación se me ha vuelto inestable. En los formularios que hago eso, entra, pero de pronto de ven en cuando fallan y se quedan en modo "no responde"

     

    Parece que eso de llamar a los subprocedimientos de forma segura parece más importante de lo que parece. TEndré que buscar algo más complicado.

    martes, 30 de octubre de 2007 16:27
  •  Javichechu Escribió:

    Pues parece ser que no es tan sencillo.

     

    La aplicación se me ha vuelto inestable. En los formularios que hago eso, entra, pero de pronto de ven en cuando fallan y se quedan en modo "no responde"

     

    Parece que eso de llamar a los subprocedimientos de forma segura parece más importante de lo que parece. TEndré que buscar algo más complicado.

     

    Arreglado, pero nota muy importante

     

    La propiedad

    CheckForIllegalCrossThreadCalls = False

     

    No es posible dejarla a False porque te pude dar como me pasa a mi problemas de estabilidad en la aplicación.

     

    Lo que hago es en el load ponerla a False para que no me pegue el pete al utilizar el subProceso, pero en el evento de fin del sub proceso vuelvo a ponerla a True.

     

    Así ningún problema

    martes, 30 de octubre de 2007 16:43
  •  Javichechu Escribió:
     Javichechu Escribió:

    Pues parece ser que no es tan sencillo.

     

    La aplicación se me ha vuelto inestable. En los formularios que hago eso, entra, pero de pronto de ven en cuando fallan y se quedan en modo "no responde"

     

    Parece que eso de llamar a los subprocedimientos de forma segura parece más importante de lo que parece. TEndré que buscar algo más complicado.

     

    Arreglado, pero nota muy importante

     

    La propiedad

    CheckForIllegalCrossThreadCalls = False

     

    No es posible dejarla a False porque te pude dar como me pasa a mi problemas de estabilidad en la aplicación.

     

    Lo que hago es en el load ponerla a False para que no me pegue el pete al utilizar el subProceso, pero en el evento de fin del sub proceso vuelvo a ponerla a True.

     

    Así ningún problema

     

     

    Pues no

    Sigue siendo inestable. Había sido casualidad, porque volvió a fallar luego otra vez.

    martes, 30 de octubre de 2007 16:59
  • Te ofresco una sugerencia algo diferente.

     

    Puedes crear un formulario de espera al que vas a llamar en el load del otro formulario antes de que empiezen todos los otros procesos.

     

    En ese formulario de espera puedes agregar el picturebox y a este agregarle el gif animado, entonces en el evento Load del formulario principal puedes hacer lo siguiente

     

    my.forms.waitform.show   (waitform es el formulario de espera. Sabes que con el namespace My puedes tener acceso a todos los formularios de tu aplicacion)

     

     

    En el formulario waitform en el evento load agregas la siguiente linea de codigo

     

    Application.DoEvents()

     

     

    En el evento Load del primer formulario, osea el que llama el waitform, debes encerrar todo en un Try...Catch...Finally...End Try

     

    Try

    my.forms.waitform.show 

    Tu codigo aqui

    Catch ex as exception

    Capturas el Exception y haces algo al respecto

    Finally

    my.forms.waitform.close

    end try

     

    El finally siempre se va ejecutar independientemente de si ha ocurrido una excepcion o no.

     

    Inclusive puedes extender la funcionalidad del waitform sobreescribiendo el metodo show de esta forma:

     

    Public Overloads Sub Show(ByVal msg As String)

    lb_Mensaje.Text = msg  'lb_Mensaje es un Label donde se muestra el mensaje al usuario

    Me.Show()

    Application.DoEvents()

    End Sub

     

    Haciendo esto podemos cambiar el codigo anterior de la siguiente forma:

     

    Try

    my.forms.waitform.show("Procesando...")

    Tu codigo aqui

    Catch ex as exception

    Capturas el Exception y haces algo al respecto

    Finally

    my.forms.waitform.close

    end try

     

    Si lo haces asi, sobreescribiendo el metodo Show, ya no sera necesario escribir nada en el evento Load del waitform.

     

    Espero te funcione.. Yo he utilizado esta tecnica en varias ocasiones y funciona perfectamente, inclusive abriendo un formulario que carga 10000 registros de una base de datos.

     

    Dejame saber si te funciono...

    martes, 30 de octubre de 2007 18:26
  • Pues la verdad es que ando bastante soprendido con este tema. En varias ocasiones he usado CheckForIllegalCrossThreadCalls y no me ha dado problemas, sin bien es cierto que tal y como comentas, posteriormente la desactivo.

     

     

    Supongo que hay algo más que hacemos diferente, pero no se me ocurre el qué.

     

    Prueba a ver con la solución de Antonio, y nos comentas.

     

    Siento no haber sido de gran ayuda....

    miércoles, 31 de octubre de 2007 7:21
    Moderador
  • Gracias antonio. Ya había pensado en una solución similar. Voy a tratar tu solución a ver si funciona.

     

    Y gracias también a ti Toni, porque si me has sido de ayuda. Tu solución no sabía ni que existía, asi que ya se algo más. En cualquier caso, tengo un formulario donde si me funciona sin problema, pero en el resto me da problemas de estabilidad, y desgraciadamente es muy complicado o al menos no se hacerlo, el buscar qué es lo que está dando problemas ya que no hay excepción, símplemente se cuelga, y es posterior a la terminación del subproceso con lo que le añade más rareza al asunto.

     

    miércoles, 31 de octubre de 2007 8:03
  • Me funciona a medias antonio

    Me explico. Todo sale bien, el formulario de espera aparece, y luego desaparece una vez terminado la carga de mi formlulario principal, pero sin embargo cuando el formulario de espera se carga, el gif no funciona; aparece pero no gira.

     

     

    miércoles, 31 de octubre de 2007 8:50
  •  Javichechu Escribió:

    Me funciona a medias antonio

    Me explico. Todo sale bien, el formulario de espera aparece, y luego desaparece una vez terminado la carga de mi formlulario principal, pero sin embargo cuando el formulario de espera se carga, el gif no funciona; aparece pero no gira.

     

     

     

    Funciona, pero lo que ocurre es que no es lo suficientemente largo el proceso como para darle tiempo a girar al reloj de arena. Alguna vez que se retrasa medio segundo más, entonces sí se ve como gira un poco. Utilizando el subProceso si se ve girar más tiempo, pero es porque posiblemente ya está pinatado el Gif, con lo que no pierde el tiempo en tener que pintar el formulario.

     

    Lo que ocurre creo yo, es que gran parte del tiempo que gasta el proceso de carga de datos, es consumido por el tiempo que tarda en cargar y pintar el formulario de "Espera" con lo que cuando ya lo carga, apenas quedan décimas para darle tiempo a girar.

    Alguna idea para aligerar el proceso de carga???

     

    Gracias en cualquier caso Wink

    miércoles, 31 de octubre de 2007 10:30
  • Te entiendo perfectamente, los procesos por lo general se llevan a cabo mas rapido de lo que se pinta la imagen, prueba lo siguiente y me avisas.

     

    El picture box tiene una propiedad WaitOnLoad que usualmente tiene como valor false. Lei por ahi que si se pone en True el proceso se detiene hasta que la imagen este totalmente cargada por lo que deberia de girar mas tiempo durante el proceso de carga de datos.

     

    Espero te funcione... SALUDOS

     

    Con respecto a ideas de como realizar la carga de datos mas rapidamente pues en realidad depende mucho de tu tecnica de desarrollo. Por ejemplo de cuantas capas estes utilizando, de tu motor de base de datos y de la capacidad de tu computadora. Si estas utilizando Strongly TypedDataSet, etc...

     

     

     

    miércoles, 31 de octubre de 2007 16:32
  • Holaa....

     

    No se si esto vaya a resolver su problema, pero les paso un codigo que utilizo cuando

    la carga del formulario es pesada. Bueno generalmente utilizo esta rutina al iniciar la 

    aplicacion....    No veo porque    se tenga que poner inestable tu aplicacion usando       

     

    CheckForIllegalCrossThreadCalls = False

    alguna vez lo hice de esa manera e igual funciono pero por seguridad informática no es

    muy recomendable dejarlo en false...

    1)  Esta es la linea (en el program) para cargar, dos formularios... un splash y el que deseamos cargar...

     

                    (new clsSplashSingleInstancia(new frmPrincipal(), new FrmSplash() )).Run(new String[]{"",""});

    2) esta es la clase ... que hace esto posible...

     

     

     public class clsSplashSingleInstancia : WindowsFormsApplicationBase

            {

                Form _mainForm, _slashScreen;

                public clsSplashSingleInstancia(Form mainForm, Form splashScreen)

                {

                    //Aquí es donde marcamos que sólo pueda haber una instancia.

                    this.IsSingleInstance = true;

                    this.EnableVisualStyles = true;

                    this.ShutdownStyle = ShutdownMode.AfterMainFormCloses;

                    _mainForm = mainForm;

                    _slashScreen = splashScreen;

                 }

     

     

     

            protected override void OnCreateMainForm()

            {

                this.MainForm = _mainForm;

            }

     

     

     

            protected override void OnCreateSplashScreen()

            {

                this.SplashScreen = _slashScreen;

            }

     

     

            protected override bool OnInitialize(System.Collections.ObjectModel.ReadOnlyCollection<string> commandLineArgs)

            {

              return base.OnInitialize(commandLineArgs);

     

            }

     

     

     

            }//fin clase

     

     

     

     

     

     

     

     













    • Propuesto como respuesta Napilex jueves, 21 de enero de 2010 20:03
    martes, 14 de abril de 2009 4:06