2009-11-10 9 views
13

Estoy usando la clase Process para ejecutar un exe.¿Mi proceso está esperando la entrada?

el EXE es una aplicación de consola de 3 ª parte que yo no controlo.

Deseo saber si el proceso está esperando una entrada en la línea de comandos.

En caso de alguna diferencia, tengo la intención de matar a la aplicación debe ser de espera para la entrada.

Hay eventos adecuados para cuando no hay salida del programa espera de ser leído, pero no puedo ver nada similar para cuando el proceso está esperando pacientemente entrada.

  ProcessStartInfo info = new ProcessStartInfo(); 
      info.FileName = "myapp.exe"; 
      info.CreateNoWindow = true; 
      info.UseShellExecute = false; 
      info.RedirectStandardError = true; 
      info.RedirectStandardInput = true; 
      info.RedirectStandardOutput = true; 
      process.StartInfo = info; 

      process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); 
      process.ErrorDataReceived += new DataReceivedEventHandler(process_ErrorDataReceived); 

      process.Start(); 

      process.BeginOutputReadLine(); 
      process.BeginErrorReadLine(); 


      process.WaitForExit(); 

¿Cómo puedo detectar que mi proceso está esperando una entrada?

+0

Su problema me interesa. Hice algunos caprichos para detectar bucles modales en aplicaciones GUI (vea mis preguntas) pero para aplicaciones de consola, hasta ahora no encontré una buena solución aún ... – jdehaan

Respuesta

14

Dependiendo de lo que el proceso tercera parte está haciendo exactamente usted podría tratar de votación estados sus hilos:

foreach(ProcessThread thread in process.Threads) 
    if (thread.ThreadState == ThreadState.Wait 
     && thread.WaitReason == ThreadWaitReason.UserRequest) 
      process.Kill(); 

... De no ser así se puede tratar de

process.StandardInput.Close(); 

después de llamar a Start (), Conjeturo que se generará una excepción en el proceso secundario si está tratando de leer desde la entrada estándar.

+0

Esto parece funcionar en mi plataforma de prueba. Lo intentaré contra el programa real que me causa problemas a continuación. Para información: El uso de process.StandardInput.Close() mi programa que se está ejecutando no recibieron una excepción, que sólo dejó de funcionar en silencio. –

+1

Hoy descubrí que desea comprobar si 'WaitReason' es' ThreadWaitReason.LpcReply'. –

2

Si la aplicación de consola tiene algún tipo de indicador de espera para la entrada, se puede analizar periódicamente la salida de la consola de texto utilizando la propiedad Process.StandardOutput del proceso y esperar a que dicho indicador. Una vez que se detecta la cadena adecuada, usted sabe que está esperando la entrada. Ver http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx.

+0

Gran enfoque. No aborda mi problema, pero es un enfoque válido para situaciones en las que puede depositar en la salida. Gracias de nuevo. –

+0

Aunque esto puede no funcionar siempre, ya que algunos programas de consola no arrojan el mensaje del usuario a la consola hasta que recibe una respuesta. –

Cuestiones relacionadas