2009-11-10 13 views
13

Sto utilizzando la classe Process per eseguire un exe.Il processo è in attesa di input?

L'exe è un'applicazione console di terze parti che non controllo.

Desidero sapere se il processo è in attesa di input sulla riga di comando.

In caso di differenze, intendo uccidere l'applicazione in attesa di input.

Ci sono eventi adatti per quando viene emesso dal programma in attesa di essere letti, ma non riesco a vedere nulla di simile per quando il processo attende pazientemente l'input.

  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(); 

Come si rileva che il processo è in attesa di input?

+0

Il tuo problema aumenta il mio interesse. Ho fatto alcuni accorgimenti per rilevare i loop modali nelle applicazioni GUI (vedi le mie domande) ma per le applicazioni console, finora non ho ancora trovato una buona soluzione ... – jdehaan

risposta

14

A seconda di ciò che il processo 3a parte sta facendo esattamente si potrebbe provare polling stati i suoi fili:

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

In mancanza di questo ... si può provare a

process.StandardInput.Close(); 

dopo aver chiamato Start (), Suppongo che un'eccezione verrà sollevata nel processo figlio se sta cercando di leggere dallo standard input.

+0

Questo sembra funzionare nel mio banco di prova. Ci proverò contro il programma attuale causandomi problemi successivi. Per informazioni: l'utilizzo di process.StandardInput.Close() il mio programma in esecuzione non ha ricevuto un'eccezione, ma ha smesso di funzionare tranquillamente. –

+1

Ho scoperto oggi che si desidera verificare se 'WaitReason' è' ThreadWaitReason.LpcReply'. –

2

Se l'applicazione della console ha una sorta di prompt in attesa di input, è possibile analizzare periodicamente il testo di output della console utilizzando la proprietà Process.StandardOutput del processo e attendere tale prompt. Una volta rilevata la stringa corretta, sai che è in attesa di input. Vedi http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx.

+0

Ottimo approccio. Non affronta il mio problema, ma è un approccio valido per situazioni in cui è possibile incassare l'output. Grazie ancora. –

+0

Anche se questo potrebbe non funzionare sempre poiché alcuni programmi di console non svuotano il prompt dell'utente alla console finché non riceve una risposta. –

Problemi correlati