2011-07-21 24 views
8

Estoy desembarazando para hacer algún trabajo y uno de los requisitos es matar el proceso si se cuelga.
Mi primer pensamiento fue Process.Responding, sin embargo, no estoy seguro de lo que realmente significa.¿Qué significa realmente Process.Responding?

¿Es lo mismo que cuando Win7 agrega un (Not Responding) al título de la ventana de una aplicación? En mi máquina, esto sucede incluso cuando MS Word intenta abrir un archivo desde un recurso compartido remoto realmente lento.

¿Cuáles son las condiciones para tener un Process.Responding false?

+1

Es exactamente lo que dice: Esto ha sido siempre uno de esos mensajes UN-fácil de usar que realmente viene de los detalles técnicos de implementación: el ciclo del mensaje no responde. – sehe

Respuesta

14

Bajo el capó, cuando se comprueba la propiedad Process.Responding, la función de Windows SendMessageTimeout se llama.

Esta función básicamente envía un mensaje a la ventana principal de otro proceso y comprueba si la ventana acepta el mensaje dentro de un tiempo de 5000 ms (Por lo tanto, verificar esta propiedad en una aplicación de consola no tiene ningún efecto).

Si desea utilizar un tiempo de espera personalizada que puede igual de bien llamar a la función SendMessageTimeout mismo:

[DllImport("user32.dll", CharSet=CharSet.Auto)] 
public static extern IntPtr SendMessageTimeout(
    HandleRef hWnd, 
    int msg, 
    IntPtr wParam, 
    IntPtr lParam, 
    int flags, 
    int timeout, 
    out IntPtr pdwResult); 

const int SMTO_ABORTIFHUNG = 2; 

public bool RespondingWithinMs(Process process, int timeoutMs) 
{ 
    IntPtr ptr2; 
    return SendMessageTimeout(
     new HandleRef(process, process.MainWindowHandle), 
     0, 
     IntPtr.Zero, 
     IntPtr.Zero, 
     SMTO_ABORTIFHUNG, 
     timeoutMs, 
     out ptr2) != IntPtr.Zero; 
} 
+0

[fuente Process.Responding] (https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs, 953): tenga en cuenta que pasan 5000 ms en tiempo de espera explícitamente. Una página de MSDN para SendMessageTimeout [aquí] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952 (v = vs.85) .aspx) tiene más información que su enlace de MSDN, esta aclara que "Esta función considera que un hilo no responde si no ha llamado a GetMessage o una función similar en cinco segundos" - Supongo que esto solo afecta al indicador 'SMTO_ABORTIFHUNG', que este es un segundo código diferente de 5 segundos comprobar. – Quantic

4

Responding significa que la ventana de la aplicación está respondiendo al usuario. el proceso debe tener un MainWindowHandle de msdn:

cierto si la interfaz de usuario del proceso asociado está respondiendo al sistema; de lo contrario, falso.

Si el proceso no tiene MainWindowHandle, esta propiedad devuelve verdadero.

Puede modificar el tiempo de espera utilizado por la aplicación. Verificación de respuesta this.

3

De http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx

Si un proceso tiene una interfaz de usuario, los contactos de propiedad de responder la interfaz de usuario para determinar si el proceso está respondiendo a la entrada del usuario. Si la interfaz no responde de inmediato, la propiedad Responding devuelve falso. Utilice esta propiedad para determinar si la interfaz del proceso asociado ha dejado de responder.

Cuestiones relacionadas