Pergunta

Este código executa "Handbrakecli" (um aplicativo de linha de comando) e coloca a saída em uma string:

Dim p As Process = New Process    
p.StartInfo.FileName = "handbrakecli"
p.StartInfo.Arguments = "-i [source] -o [destination]"
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.Start

Dim output As String = p.StandardOutput.ReadToEnd
p.WaitForExit 

O problema é que isso pode levar até 20 minutos para ser concluído, durante o qual nada será relatado de volta ao usuário. Depois de concluído, eles verão toda a saída do aplicativo, que inclui detalhes de progresso. Não é muito útil.

Portanto, estou tentando encontrar uma amostra que mostre a melhor maneira de:

  1. Inicie um aplicativo externo (oculto)
  2. Monitore sua produção periodicamente, pois exibe informações sobre seu progresso (para que eu possa extrair isso e apresentar uma boa barra de porcentagem ao usuário)
  3. Determine quando o aplicativo externo terminou (para que eu não possa continuar com minha própria execução de aplicativos)
  4. Mate o aplicativo externo, se necessário, e detecte quando isso acontecer (para que, se o usuário acertar "cancelar", eu tome as etapas apropriadas)

Alguém tem algum trecho de código recomendado?

Foi útil?

Solução

A propriedade StandardOutput é do tipo StreamReader, que possui outros métodos que não o ReadToEnd. Seria mais código, mas se você usasse o método de leitura, poderá fazer outras coisas como fornecer ao usuário a oportunidade de cancelar ou relatar algum tipo de progresso.

Link para ler o método com o exemplo de amostra:

http://msdn.microsoft.com/en-us/library/ath1fht8(v=vs.90).aspx

Editar:

A classe de processo também possui um método BeginOutputReadLine, que é uma chamada de método assíncrona com retorno de chamada.

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline(v=vs.90).aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top