none
Problema con hilos y delegados. RRS feed

  • Pregunta

  • Hola, estoy desarrollando un programa que al darle a un botón inicia dos servidores (crea 2 hilos distintos). Ahora, dentro del botón "Iniciar Servidor" creo los hilos y los inicio. Mi problema es que quiero poder cerrar los hilos con otro botón y no puedo hacer simplemente hiloUDP.Abort();. Algun consejo? Quiero poder abrir y cerrar los hilos cuantas veces quiera.
    private void Button5_Click(object sender, EventArgs e)
            {
                Servidor_TCP serverTCP = new Servidor_TCP("ServidorTCP", 8000);
                Servidor_UDP serverUDP = new Servidor_UDP("ServidorUDP", 13001);
    
                ThreadStart delegadoUDP = new ThreadStart(serverUDP.Start);
                ThreadStart delegadoTCP = new ThreadStart(serverTCP.Inicio);
    
                Thread hiloUDP = new Thread(delegadoUDP);
                Thread hiloTCP = new Thread(delegadoTCP);
    
                hiloUDP.Start();
                hiloTCP.Start();
            }
    
    

    domingo, 6 de octubre de 2019 16:54

Respuestas

  •  no puedo hacer simplemente hiloUDP.Abort();.

    Solo existen dos formas para detener un hilo desde fuera, que son thread.Abort() y thread.Interrupt().

    La alternativa es usar una variable compartida, y meter en la variable algún valor que signifique "el hilo tiene que parar" y que el hilo examine periódicamente la variable y en caso de que la variable solicite parar entonces que el hilo se detenga a sí mismo.

    Si optas por thread.Abort o .Interrupt, las dos hacen lo mismo: generan una excepción dentro del hilo, que se puede interceptar con try...catch, de manera que el hilo puede cerrarse ordenadamente dentro del catch. La diferencia entre ambas es que el Interrupt puede optar por no detenerse, es decir, puede procesar la interrupción en el catch y seguir ejecutándose. A lo mejor esto sí que te sirve (a diferencia del abort) porque al recibir el interrupt puedes pasar a ejecutar otra cosa (por ejemplo, un Thread.Sleep), y luego cuando recibas otra nueva interrupción volver a ejecutar lo que estabas haciendo.

    domingo, 6 de octubre de 2019 17:16
    Moderador
  • Hola

    haslos como variable local d la clase

    Thread hiloUDP ; Thread hiloTCP;

    private void Button5_Click(object sender, EventArgs e)
            {
                Servidor_TCP serverTCP = new Servidor_TCP("ServidorTCP", 8000);
                Servidor_UDP serverUDP = new Servidor_UDP("ServidorUDP", 13001);
    
                ThreadStart delegadoUDP = new ThreadStart(serverUDP.Start);
                ThreadStart delegadoTCP = new ThreadStart(serverTCP.Inicio);
    
                hiloUDP = new Thread(delegadoUDP);
                hiloTCP = new Thread(delegadoTCP);
    
                hiloUDP.Start();
                hiloTCP.Start();
            }

    domingo, 6 de octubre de 2019 17:17
  • Perfecto, eso me funcionó. Ahora, cuando llamo a hiloUDP.Abort(); mi programa se traba por completo, no puedo hacer click en ningun boton. Y probé usando hiloUDP.Interrupt(); pero el programa sigue funcionando igual.
    domingo, 6 de octubre de 2019 17:47

Todas las respuestas

  •  no puedo hacer simplemente hiloUDP.Abort();.

    Solo existen dos formas para detener un hilo desde fuera, que son thread.Abort() y thread.Interrupt().

    La alternativa es usar una variable compartida, y meter en la variable algún valor que signifique "el hilo tiene que parar" y que el hilo examine periódicamente la variable y en caso de que la variable solicite parar entonces que el hilo se detenga a sí mismo.

    Si optas por thread.Abort o .Interrupt, las dos hacen lo mismo: generan una excepción dentro del hilo, que se puede interceptar con try...catch, de manera que el hilo puede cerrarse ordenadamente dentro del catch. La diferencia entre ambas es que el Interrupt puede optar por no detenerse, es decir, puede procesar la interrupción en el catch y seguir ejecutándose. A lo mejor esto sí que te sirve (a diferencia del abort) porque al recibir el interrupt puedes pasar a ejecutar otra cosa (por ejemplo, un Thread.Sleep), y luego cuando recibas otra nueva interrupción volver a ejecutar lo que estabas haciendo.

    domingo, 6 de octubre de 2019 17:16
    Moderador
  • Hola

    haslos como variable local d la clase

    Thread hiloUDP ; Thread hiloTCP;

    private void Button5_Click(object sender, EventArgs e)
            {
                Servidor_TCP serverTCP = new Servidor_TCP("ServidorTCP", 8000);
                Servidor_UDP serverUDP = new Servidor_UDP("ServidorUDP", 13001);
    
                ThreadStart delegadoUDP = new ThreadStart(serverUDP.Start);
                ThreadStart delegadoTCP = new ThreadStart(serverTCP.Inicio);
    
                hiloUDP = new Thread(delegadoUDP);
                hiloTCP = new Thread(delegadoTCP);
    
                hiloUDP.Start();
                hiloTCP.Start();
            }

    domingo, 6 de octubre de 2019 17:17
  • Perfecto, eso me funcionó. Ahora, cuando llamo a hiloUDP.Abort(); mi programa se traba por completo, no puedo hacer click en ningun boton. Y probé usando hiloUDP.Interrupt(); pero el programa sigue funcionando igual.
    domingo, 6 de octubre de 2019 17:47