2012-03-16 5 views
7

1.Tengo algunos bucles infinte ¿cómo puedo obtener el menor consumo de CPU? ¿Debo usar un retraso?Cómo obtener el menor consumo de CPU al tener un bucle infinte en un hilo

2.Si tengo varios subprocesos ejecutándose en mi aplicación y uno de ellos es THREAD_PRIORITY_ID, ¿afecta a otros subprocesos?

Mi código es como esto para cada hilo

procedure TMatchLanLon.Execute; 
begin 
while not Terminated do 
    begin 
      //some code 
      Sleep(1000); 
    end; 
end; 
+0

Agregue su versión de Delphi, por favor. Es importante para las preguntas relacionadas con el hilo. – TLama

+0

@TLama mi versión delphi es XE2 – opc0de

+1

Duplicado de [su propia pregunta] (http://stackoverflow.com/questions/9715378/infinite-loops-in-separate-threads "bucles infinitos en hilos separados")? –

Respuesta

9

Normalmente, un hilo debe dormir hasta señalado, pero no usando Sleep o SleepEx.

Crea un evento y espera a que se lo señalice, ya sea usando TEvent o directamente a Win32 API con WaitForSingleObject.

Sleep causa muchos problemas, incluyendo lo que llamo "enfermedad de la bella durmiente". El resto de su aplicación ha terminado y cerró hace unos cientos de microseconds, y su hilo ha dormido durante un "millón de años" en términos relativos de sincronización de la computadora, y cuando se despierta, el resto de su aplicación hace tiempo que terminó. Lo siguiente que probablemente haga su hilo de fondo es acceder a algún objeto al que tenga referencia, que estaba congelado, y luego (si tiene suerte) se bloqueará. No use Sleep en hilos. Espere a que ocurran eventos o use algún subproceso de trabajo preconstruido (como OmniThreadLibrary uno).

+4

Si su hilo está ejecutando código (que no sea el modo reposo), aún puede hacerlo después de que finalice la aplicación. Un bucle simple o una operación compleja también pueden tomar segundos durante los cuales no hay interacción con el resto de la aplicación. Entonces dormir no está mal en ese sentido. Si el hilo se bloquea después de un sueño, también puede bloquearse después de (o durante) otra operación. No dice que usar dormir en un hilo es bueno, pero la razón por la que describes tampoco lo es. – GolezTrol

+4

Windows detiene todos los subprocesos al salir de la aplicación antes de desasignar los recursos. Sleep() está muy bien en los hilos. Lo he estado usando (para sus propios fines, no como una muleta de sondeo en una aplicación desafiada por comunicaciones), durante décadas. –

+0

'Si su hilo está ejecutando código (que no sea sleep), aún puede hacerlo después de que se finalice la aplicación' - no, no puede. Todos los subprocesos tienen su estado establecido para que nunca se vuelvan a ejecutar o, si se ejecutan en un núcleo diferente al que salió, se interrumpe el procesador para detenerlos. Cuando todos los hilos se han detenido, los recursos se desasignan. –

6

Tengo algunos bucles infinte ¿cómo puedo obtener el menor consumo de CPU?

Bloqueando el bucle hasta que haya algo que hacer.

Si tengo varios hilos ejecutándose en mi aplicación y uno de ellos es THREAD_PRIORITY_IDLE ¿afecta a otros hilos?

..depende. Probablemente no, pero si hay otros subprocesos esperando el resultado de este subproceso, o el lanzamiento de un bloqueo desde él, entonces los otros subprocesos efectivamente se 'arrastran' al THREAD_PRIORITY_IDLE también.
Aparte de esta inversión de prioridad, (que puede causar interbloqueos cuando los subprocesos tienen varios niveles de prioridad), los espirales, una construcción de sincronización que normalmente solo es mala, puede volverse desastrosa.

Cuestiones relacionadas