2012-05-17 19 views
5

Tengo una aplicación de adquisición de datos ejecutándose en Windows 7, usando VC2010 en C++. Un hilo es un latido que envía un cambio cada .2 segundos para mantener vivo algún hardware que tiene un tiempo de espera de aproximadamente .9 segundos. Normalmente, la llamada de latido requiere de 10 a 20 ms y el hilo pasa el resto del tiempo durmiendo.¿Puedo establecer la prioridad de un solo subproceso por encima de 15 para un proceso de prioridad normal?

Ocasionalmente, sin embargo, habrá un retraso de 1-2 segundos y el hardware se apagará momentáneamente. El hilo del latido se está ejecutando en THREAD_PRIORITY_TIME_CRITICAL que es 15 para un proceso de prioridad normal. Mis otros hilos se ejecutan con la prioridad normal, aunque utilizo una DLL para controlar otro hardware y he notado con Process Explorer que comienza varios subprocesos en el nivel 15.

No puedo rastrear la fuente de la lenta hacia abajo, pero otros temas en mi aplicación están viendo el mismo tipo de retrasos cuando esto sucede. He hecho varias optimizaciones para el código de latido aunque es bastante simple, pero las fallas ocasionales todavía están sucediendo. Ahora me pregunto si puedo aumentar la prioridad de este hilo más allá de 15 sin especificar REALTIME_PRIORITY_CLASS para todo el proceso. Si no, ¿hay alguna desventaja que deba tener en cuenta al usar REALTIME_PRIORITY_CLASS? (Aparte de este hilo latido, el resto de la aplicación no necesita tiempo en tiempo real).

(¿O alguien tiene alguna idea sobre cómo rastrear estas ralentizaciones ... no estoy seguro si la fuente podría estar en mi aplicación o en otro lugar en el sistema).

Actualización: Así que no había intentado pasar 31 en mi llamada AfxBeginThread y resulta que ignora ese valor y establece el hilo a la prioridad normal en lugar de los 15 que obtengo con THREAD_PRIORITY_TIME_CRITICAL.

Actualización: Resulta que la ejecución del Desfragmentador de disco es una buena forma de provocar muchos retrasos en el hilo. Incluso ejecutar el proceso en REALTIME_PRIORITY_CLASS y el hilo del latido en THREAD_PRIORITY_TIME_CRITICAL (nivel 31) no parece ayudar. Lo siguiente que debe intentar es llamar a AvSetMmThreadCharacteristics ("Pro Audio")

Actualización: Programar el hilo del latido como "Pro Audio" funciona para aumentar la prioridad del hilo más allá de 15 (Base = 1, Dinámico = 24) pero no parece hacer una diferencia real cuando se está ejecutando desfragmentación. Pude correlacionar muchas de las ralentizaciones con el desfragmentador de disco, así que apagué el escaneo semanal. Todavía no podemos explicar algunas demoras, así que vamos a aumentar a un tiempo de espera de 5-10 segundos.

+6

Me asusta cuando la gente usa palabras como "latido" y "cerrado por razones de seguridad" en una cuestión de programación acerca de Windows . :) Ciertamente no es un RTOS: http://en.wikipedia.org/wiki/Real-time_operating_system – HostileFork

+2

Creo que su perro guardián es estricto. En un RTOS 500ms son muchos, pero en Windows cualquier cosa por debajo de 15 segundos es arriesgado. Si tienes control sobre tu perro guardián, te sugiero alargar el tiempo de espera o cerrarlo solo si falla un cierto número de tus desencadenantes. – Fozi

+0

Pregunta: ¿Cuál es el tiempo después del cual su hardware se apagará? – Fozi

Respuesta

4

Incluso si pudiera, aumentar la prioridad no ayudará. El subproceso ejecutable de mayor prioridad obtiene el procesador en todo momento.

Es muy probable que se produzca algún proceso de interrupción prolongado mientras las interrupciones están deshabilitadas. Las interrupciones funcionan de manera efectiva con una prioridad mayor que cualquier hilo.

Podría ser de video, red, disco, serie, USB, etc., etc. Tomará algún conocimiento para deshabilitar selectivamente o utilizar un controlador alternativo para ver si el sistema problemático se ve afectado. Una vez que lo encuentre, entonces encontrar una forma de prevenirlo puede variar de trivial a imposible dependiendo de lo que sea.

Sin más conocimiento sobre el sistema, es difícil de decir. ¿Has intentado ejecutarlo en un PC diferente?

+0

gracias por el voto de confianza :) me he ejecutado en algunas computadoras diferentes, pero generalmente siempre tengo el mismo software y controladores instalados. Pensaré en lo que puedo inhabilitar y ejecutar, pero será difícil rastrearlo ya que el problema es intermitente, parece suceder cada día o dos. ¡Gracias! – jacobsee

+0

La razón por la que espero que marque la diferencia es que este dll de otro hardware tiene 5 de 7 de su hilo en el nivel 15. Cuando las cosas se llenan, prefiero que mi hilo tenga prioridad sobre ellos. Sin embargo, si se trata de una interrupción de hardware como sugiere que no ayudaría. – jacobsee

0

Yo trataría de usar CreateWaitableTimer() & SetWaitableTimer() y veré si están sujetas a los mismos problemas de apropiación.

1

Oficialmente no puede usar hilos REALTIME en un proceso que no tiene el REALTIME_PRIORITY_CLASS.

Unoficially se podía jugar con los indocumentados NtSetInformationThread véase: http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/NtSetInformationThread.html

Pero como yo no lo he probado, no tengo más información sobre esto.

Por otro lado, como se dijo antes, nunca se puede estar seguro de que el sistema operativo no se tome su tiempo cuando caduque el cuanto de su hilo. Ciertos controladores mal escritos son a menudo la causa de dicha latencia.

De lo contrario, es un software que puede decirle si tiene que comportarse mal partes del kernel: http://www.thesycon.de/deu/latency_check.shtml

+0

la verificación de latencia parece útil, ¡gracias! – jacobsee

+0

Si encuentra un caso en el que la latencia de DPC aumentará drásticamente, las prioridades de subprocesos no pueden ayudarlo ya que los DPC (Llamadas de procedimiento retardado) se ejecutan con mayor "prioridad" (en realidad IRQL) que cualquier otro modo de usuario ... – Jaka

Cuestiones relacionadas