2009-05-22 9 views
7

¿Puedo obtener un conteo de suspensiones de hilos en Windows CE, usando C o Visual C++, sin llamar a las funciones de reanudar o suspender? La única forma que veo de hacerlo es algo así como¿Cómo puedo saber si un hilo está suspendido en Windows CE

int Count = SuspendThread(ThreadHandle); 
ResumeThread(ThreadHandle); 

Esto tiene un par de problemas, en primer lugar, que prefiero no suspender el hilo, y en segundo lugar las funciones de suspensión puede fallar si el hilo se está ejecutando el código del kernel . Puedo evitar esto, pero creo que debería haber una solución más elegante. También podría revertirlo usando

int Count = ResumeThread(ThreadHandle); 
SuspendThread(ThreadHandle); 

Pero esto tiene problemas similares. ¿Algún buen método alternativo para obtener el conteo suspendido desde el mango?

Respuesta

4

Tengo una solución combinada. Use WaitForSingleObject() para determinar si el hilo está suspendido o no.

Si no se suspende, el recuento de suspender obviamente 0.

Si se suspende, es seguro que llamar SuspendThread() para obtener el recuento de suspensión. Como ya está suspendido, no se parará nada.

+0

Sí, esta es la única manera de hacerlo. – ctacke

+0

Interesante respuesta. ¿Cuánto tiempo esperaría, sería suficiente 1 ms en todos los casos, o es probable que sea más lento? –

+0

En realidad, creo que puede usar el tiempo de espera 0. WaitForSingleObject() probará el estado y lo devolverá inmediatamente. Solo está interesado en comprobar el valor de retorno en WAIT_OBJECT_0.Lo cual le diría que el estado del hilo está señalizado y, por lo tanto, no está suspendido. – ralphtheninja

0

Probablemente con WaitForSingleObject puede verificar si el hilo está suspendido pero no puede recuperar el contador de suspensión.

0

Incluso el subproceso en activo todavía recibirá un resultado WAIT_TIMEOUT, esto porque los subprocesos señalizan cuando terminan, no cuando se están ejecutando.

Dicho esto, WaitForSingleObject (hThread, INFINITE) espera hasta que termina el hilo.

+0

Cuál es por qué la espera propuesta fue para 0, no INFINITO. – ctacke

1

No debe suspender ningún hilo en ninguna plataforma, nunca.

En su lugar, debe agregar puntos de sincronización en su código de subprocesamiento que espere explícitamente a que se marque una bandera antes de que se le permita continuar. De esta manera, usted sabe donde se pausará, o al menos sabrá que se detendrá en puntos seguros.

las siguientes operaciones en las discusiones debe prohibirse, a tanto alzado, desde cualquier plataforma para cualquier programador:

  • Suspender
  • Reanudar (ya que no lo necesita si no se puede suspender el hilo)
  • Kill/Abortar

Usted debe nunca, nunca, imponer por la fuerza su voluntad desde el exterior de un hilo. No tiene garantía de lo que está haciendo, qué tipo de recursos está bloqueando actualmente.

Siempre escriba enhebrado en modo cooperativo. El hilo debe ser consciente de su entorno y ceder a los deseos del mundo exterior para salir de forma ordenada o pausar hasta que pueda continuar de forma segura.

+0

Del mismo modo, el uso de INFINITE en una espera nunca debería ocurrir. – ctacke

+0

Estoy totalmente de acuerdo, es un cuelgue esperando a suceder. –

+0

+1, después de mucha tediosa depuración, terminé eliminando todas las llamadas Suspender/Reanudar, y reduciendo todos los objetos de sincronización a un único mutex asociado con un uso de pila de comunicaciones entre los dos hilos en cuestión. –

Cuestiones relacionadas