none
Abrir y cerrar formularios en distinto tiempo RRS feed

  • Pregunta

  • Hola buen día, tengo una problema que no se bien como resolver, lo que quiero es que al utilizar el evento click de un boton me abra otro formulario que contiene un webbrowser por un determinado tiempo y luego me lo cierre, con un formulario pude hacerlo utilizando la clase Timer y este codigo

    private void AbrirForm()
            {
            for (int contador = 0; contador < 300; contador++)
                {
                    FormBrowser form1 = new FormBrowser();
                    form1.Show();
    
                    while (segundos < 20)
                    {
                        Application.DoEvents();
                    }
                    segundos = 0;
                    form1.Close();
                    form1.Dispose();
                }
            }


    Esto funciona bien poniendo que la variable segundos se vaya incrementando cada un segundo en el evento tick del timer

    El problema es que cuando quiero hacer lo mismo pero con varios form ya estaría teniendo un problema porque se queda en el ciclo while

    while (segundos < 20)
    {
       Application.DoEvents();
    }


    Quise meter el código dentro del evento tick el problema que tengo es que como tengo el new form en ese codigo me crea muchas instancias y luego no puedo cerrarlas

    Tambien trate de usar un timer para cada formulario y usar el intervalo correspondiente olvidandome de la variable segundos,  pero tengo el mismo problema que tengo que poner un while para esperar y poder cerrar el formulario y no ejecuta lo demas


    Por ultimo que se me ocurrio fue usar distintos threads

    Thread thread1 = new Thread(AbrirForm);
    thread1.Start();

    Pero me tira error en la siguiente parte

    this.webBrowser1 = new System.Windows.Forms.WebBrowser();

    "Excepción no controlada del tipo 'System.Threading.ThreadStateException' en System.Windows.Forms.dll

    Información adicional: No se puede crear una instancia del control ActiveX '8856f961-340a-11d0-a96b-00c04fd705a2' porque el subproceso actual no está en un contenedor uniproceso."




    Espero alguno pueda ayudarme, saludos



    miércoles, 22 de mayo de 2019 7:42

Respuestas

  • Yo pondría el código de cerrar el formulario dentro del propio formulario con su variable local segundos y su timer incluido.

    De esta forma cada formulario al iniciarse crea su variable segundos a cero y la va incrementando hasta que alcance el valor máximo que cierra el formulario.

    El código tanto de ir incrementando el valor de segundos como de comprobar si ha llegado al valor másomo inclúyelo en el evento del timer.


    Saludos, Javier J

    • Propuesto como respuesta Carlos_Ruiz_M miércoles, 22 de mayo de 2019 18:30
    • Marcado como respuesta AlejandroRicotti lunes, 27 de mayo de 2019 7:13
    miércoles, 22 de mayo de 2019 9:09

Todas las respuestas

  • Yo pondría el código de cerrar el formulario dentro del propio formulario con su variable local segundos y su timer incluido.

    De esta forma cada formulario al iniciarse crea su variable segundos a cero y la va incrementando hasta que alcance el valor máximo que cierra el formulario.

    El código tanto de ir incrementando el valor de segundos como de comprobar si ha llegado al valor másomo inclúyelo en el evento del timer.


    Saludos, Javier J

    • Propuesto como respuesta Carlos_Ruiz_M miércoles, 22 de mayo de 2019 18:30
    • Marcado como respuesta AlejandroRicotti lunes, 27 de mayo de 2019 7:13
    miércoles, 22 de mayo de 2019 9:09
  • Hola

    Viendo tu codigo no veo donde se incrementan los segundos y otra manera seria algo asi

    segundos=0;
    while(segundos < 20)
    {
        Thread.Sleep(1000);
        segundos++;
    }

    tambien pedria funcionar asi

            private void AbrirForm()
            {
            for (int contador = 0; contador < 300; contador++)
                {
                    FormBrowser form1 = new FormBrowser();
                    form1.Show();
                    Thread.Sleep(20000);
                    segundos = 0;
                    form1.Close();
                    form1.Dispose();
                }
            }

    espero te ayude suerte

    • Propuesto como respuesta eRiver1 miércoles, 22 de mayo de 2019 15:18
    miércoles, 22 de mayo de 2019 14:01
  • Muchas gracias, usa respuesta sencilla que me funciono
    lunes, 27 de mayo de 2019 7:13
  • Hola

    Viendo tu codigo no veo donde se incrementan los segundos y otra manera seria algo asi

    segundos=0;
    while(segundos < 20)
    {
        Thread.Sleep(1000);
        segundos++;
    }

    tambien pedria funcionar asi

            private void AbrirForm()
            {
            for (int contador = 0; contador < 300; contador++)
                {
                    FormBrowser form1 = new FormBrowser();
                    form1.Show();
                    Thread.Sleep(20000);
                    segundos = 0;
                    form1.Close();
                    form1.Dispose();
                }
            }

    espero te ayude suerte

    Hola, ya lo pude resolver de la manera que me aconsejo Javier, los segundos se aumentan en el evento timer del tick, pero aun asi no era una solucion cuando querias utilizar varios formularios al mismo tiempo, ya que el sleep no te dejaria proseguir con los demas

    Gracias de todas maneras,

    saludos!

    lunes, 27 de mayo de 2019 7:16