2011-05-20 18 views
6

Me estoy poniendo en práctica un hilo muy básico en C#:hilo de obtener el 100% de la CPU muy rápido

private Thread listenThread; 

public void startParser() 
{ 
    this.listenThread = new Thread(new ThreadStart(checkingData)); 
    this.listenThread.IsBackground = true; 
    this.listenThread.Start(); 
} 

private void checkingData() 
{ 
    while (true) 
    { 

    } 

}

Entonces inmediatamente obtener el 100% de la CPU. Quiero verificar si los datos del sensor se leen dentro del ciclo while (verdadero). ¿Por qué es así?

Gracias de antemano.

+0

¿Podemos suponer que hay alguna implementación en el bucle 'while', y que tiene alguna capacidad de terminación? – Yuck

+1

Obtener 100% de CPU es correcta de acuerdo con este código. ¿Hay algún intervalo en el que quiera verificar los datos del sensor? Probablemente tengas que dormir el hilo en consecuencia. – CharithJ

Respuesta

12

while (true) es lo que está matando a su CPU.

Puede agregar Thread.Sleep(X) mientras le da descanso a la CPU antes de volver a verificar.

Además, parece que realmente necesita un temporizador.

Mire una de las clases del temporizador aquí http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx.

Use el temporizador con el intervalo de extracción más alto que pueda, 1 segundo, medio segundo.
Debe sacrificar el uso de la CPU y la demora máxima que puede pagar entre cheques.

+0

Hola. Gracias. Pero entonces, ¿cómo puedo esperar a que lleguen los datos? Me gustaría verificar constantemente los datos que vienen. – olidev

+1

¿Con qué frecuencia debe verificar de manera realista? Incluso dejarlo dormir 10ms hará una gran diferencia. –

+0

@JoesyXHN - ¿De dónde vienen sus datos? –

2

Deje que su bucle duerma. Está corriendo y cansándose. Por lo menos, déjelo tomar un descanso de eventualmente.

+0

debo usar: timer.tick por 1 milisegundo en lugar de usar thread con while loop y sleep por 1 milisegundo? – olidev

+0

BAHAHAHAHAHAHAHA! 1 milisegundo! prueba 100-500 milisegundos. –

0

puede usar la cola de bloqueo. tomar un elemento de la cola de bloqueo bloqueará el hilo hasta que se coloque un elemento en la cola. eso no cuesta ninguna CPU.

con .net4, puede utilizar BlockingCollection http://msdn.microsoft.com/en-us/library/dd267312.aspx

bajo la versión 4, no está bloqueando .net framework cola int.

puede encontrar muchos implementos de cola de bloqueo si lo busca en google.

aquí es una aplicación

http://www.codeproject.com/KB/recipes/boundedblockingqueue.aspx

por cierto. ¿De dónde provienen los datos de los que espera?

EDITAR

si desea comprobar el archivo. puede usar FileSystemWatcher para verificarlo con el bloque de hilos.

si sus datos provienen de una API externa y la API no bloquea el hilo, no hay forma de bloquear el hilo, excepto usar el hilo.Dormir

+0

cómo la colección de bloqueo ayudará si JoesyXHN necesita verificar un archivo o una API externa u otra cosa? –

+0

tienes razón. si quiere ver un archivo o los datos provienen de una API externa. la colección de bloqueo es inútil. –

+0

así que le pregunté de dónde provienen los datos. –

1

Debido a que su función no está haciendo nada en el interior del bloque de tiempo, se agarra a la CPU y, a efectos prácticos, nunca se deja ir, así que otros hilos pueden hacer su trabajo

private void checkingData() 
{ 
    while (true) 
    { 
     // executes, immediately 
    } 
} 

Si lo cambia a la siguiente, debería ver el consumo de CPU más razonable:

private void checkingData() 
{ 
    while (true) 
    { 
     // read your sensor data 

     Thread.Sleep(1000); 
    } 
} 
+0

Por favor, no hagas modificaciones triviales solo para topar tus publicaciones. Se recomienda la edición, pero realice mejoras reales. ¡Gracias! –

0

Si eres de votación para una condición, sin duda hacer que otros sugirieron y poner en un sueño. También agregaría que si necesita un rendimiento máximo, puede usar un truco estadístico para evitar dormir cuando se leen los datos del sensor. Cuando detecte que los datos del sensor están inactivos, por ejemplo, 10 veces seguidas, comience a dormir en cada iteración nuevamente.

Cuestiones relacionadas