Foros del Web » Programación para mayores de 30 ;) » .NET »

Hebra... llena 100% de Recursos de la CPU y no se por que...

Estas en el tema de Hebra... llena 100% de Recursos de la CPU y no se por que... en el foro de .NET en Foros del Web. Buenas noches foreros... Creo que el título del POST es bastante claro. Este es mi código y... no entiendo por qué la cpu sube como ...
  #1 (permalink)  
Antiguo 04/01/2009, 19:08
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Hebra... llena 100% de Recursos de la CPU y no se por que...

Buenas noches foreros...

Creo que el título del POST es bastante claro. Este es mi código y... no entiendo por qué la cpu sube como la espuma cuando inicio la Hebra.

Código:
        private void button1_Click(object sender, EventArgs e)
        {
            System.Threading.Thread objHebra = new System.Threading.Thread(new System.Threading.ThreadStart(ProcesarPeticiones));
            objHebra.IsBackground = true;
            objHebra.Start();
        }

        private System.Collections.Queue _ColaPeticiones = new System.Collections.Queue();
        private void ProcesarPeticiones()
        {
            while (true)
            {
                if (_ColaPeticiones.Count > 0)
                {
                    Object[] objetosRecibidos = (Object[])_ColaPeticiones.Dequeue();
                    ClsMensaje objMensaje = (ClsMensaje)objetosRecibidos[0];
                    TcpClient clienteConectado = (TcpClient)objetosRecibidos[1];

                    ProcesarMensaje(objMensaje, clienteConectado);
                }
            }
        }

En fin, espero ustedes puedan ver lo que yo no veo...

Gracias y FELIZ AÑOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO !!!

jejejeje. Un abrazo gente.
__________________
Charlie.
  #2 (permalink)  
Antiguo 04/01/2009, 19:23
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: Hebra... llena 100% de Recursos de la CPU y no se por que...

porq un While(true) se que es una solucion practica a todo esto del delay entre mensajes pero es una mala practica al tener haciendo un loop sin fin que consume ciclos de reloj y en el stack del programa se acumulan N millones de comparaciones de cola.Count>0 que consume un ciclo de reloj o menos pero a la larga estan rapido que puede llegar a fastidiar tu performance.

porque no simplemente haces un timer que recorra y desencole tus mensajes.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #3 (permalink)  
Antiguo 04/01/2009, 23:46
 
Fecha de Ingreso: septiembre-2008
Mensajes: 68
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Hebra... llena 100% de Recursos de la CPU y no se por que...

Según tu codigo tienes ahi un bucle infinito porque adentro del while no hay una condición que asegure que tu contador valla decrementando o algo asi, porque solo pregunta por la cantidad de la cola de mensajes mas no está tocando el valor de la misma ( según tu código mostrado ). Declarando una variable fuera del while que almacene la cantidad de mensajes y que despues de la última linea de código dentro de tu while lo valla decrementando e introducir un "else" con la condición de que si llegó a cero rompa el bucle y salga de ahi puede ser la solución. Es mejor usar un for

For(i = cantidadmensajes; i > 0 ; i--){
" tu código
}

un ejemplito

espero que soluciones tu problema. suerte =)
  #4 (permalink)  
Antiguo 05/01/2009, 01:53
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Respuesta: Hebra... llena 100% de Recursos de la CPU y no se por que...

Megaligathor, gracias por contestar, pero Peterpay (Del que también estoy agradecido por contestar, que conste jejeje) tiene razón aun que no me gusta mucho esa solución de usar un Timer. Me gustaría algo más técnico.

La verdad es que el while(true) tampoco me gustaba a mi mucho.
__________________
Charlie.
  #5 (permalink)  
Antiguo 05/01/2009, 01:59
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Respuesta: Hebra... llena 100% de Recursos de la CPU y no se por que...

¿Qué os parece esto?

Código:
        private void button1_Click(object sender, EventArgs e)
        {
            System.Threading.Thread objHebra = new System.Threading.Thread(new System.Threading.ThreadStart(ProcesarPeticiones));
            objHebra.IsBackground = true;
            objHebra.Start();
        }

        private System.Collections.Queue _ColaPeticiones = new System.Collections.Queue();
        private void ProcesarPeticiones()
        {
            bool procesarPeticiones = true;
            while (procesarPeticiones)
            {
                if (_ColaPeticiones.Count > 0)
                {
                    Object[] objetosRecibidos = (Object[])_ColaPeticiones.Dequeue();
                    ClsMensaje objMensaje = (ClsMensaje)objetosRecibidos[0];
                    TcpClient clienteConectado = (TcpClient)objetosRecibidos[1];

                    ProcesarMensaje(objMensaje, clienteConectado);
                }else{
                     procesarPeticiones = false;
                }
            }
        }

Y cada vez que se vaya a meter una petición nueva, ejecutar la Hebra. ¿Como lo veis?
__________________
Charlie.
  #6 (permalink)  
Antiguo 05/01/2009, 05:27
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 10 meses
Puntos: 7
Respuesta: Hebra... llena 100% de Recursos de la CPU y no se por que...

Solución PERFECTA !!!

Por si alguien le interesa:
1-. Crear una nueva cola(En el explorador de servidores del Visual Studio se pueden crear dentro de Message Queues).

Se pueden crear Públicas o Privadas. Las públicas es que pueden ser accedidas desde otro equipo que esté en red y las privadas solo son usadas desde el equipo en el que se ha creado. Para mi caso, la cree privada.

2-. Implementar el siguiente código:
Código:
        private MessageQueue _ColaLlamadas = null;
        private void Form1_Load(object sender, EventArgs e)
        {

            _ColaLlamadas = new MessageQueue(@"gsproyecto11\private$\colaprueba");            
            _ColaLlamadas.ReceiveCompleted += new ReceiveCompletedEventHandler(_ColaLlamadas_ReceiveCompleted);
            _ColaLlamadas.BeginReceive();
        }

        void _ColaLlamadas_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
        {
            System.Messaging.Message mensajeCola = ((MessageQueue)sender).EndReceive(e.AsyncResult);

            this.Invoke((MethodInvoker)delegate
            {
                lbPeticiones.Items.Add(((ClsMensaje)mensajeCola.Body).Contenido);
            });

            _ColaLlamadas.BeginReceive();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            ClsMensaje objMensaje = new ClsMensaje("un mensajito");
            _ColaLlamadas.Send(objMensaje);
        }
Asi estoy todo el tiempo recogiendo las peticiones, pero sin sobrecargar el sistema, jejeje. Creo que es la solución perfecta. Cualquier duda o comentario... estoy abierto a los mismos.

Saludos y espero le sirva a alguien !!!

P.D.: Foros de XAML - Silverlight ?? ... snif, snif...
__________________
Charlie.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:24.