2010-04-12 3 views
3

Ce code exécute « handbrakecli » (une application de ligne de commande) et place la sortie dans une chaîne:Redirect et Parse dans stdout en temps réel d'un long processus en cours d'exécution dans vb.net

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 

Le problème est que cette peut prendre jusqu'à 20 minutes pour se terminer pendant lesquelles rien ne sera rapporté à l'utilisateur. Une fois qu'il est terminé, ils verront toutes les sorties de l'application qui comprend les détails de la progression. Pas très utile.

Par conséquent, je suis en train de trouver un exemple qui montre la meilleure façon de:

  1. Démarrer Une application externe (cachée)
  2. Surveillez sa sortie périodiquement car il affiche des informations à ce sujet est le progrès (donc je peut extraire ceci et présenter un bon pourcentage de barre à l'utilisateur)
  3. Déterminez quand l'application externe est finie (ainsi je ne peux pas continuer avec l'exécution de mes propres applications)
  4. Tuez l'application externe si nécessaire et de détecter quand ceci a arrivé (de sorte que si l'utilisateur clique sur "annuler", je prends les mesures appropriées)

Quelqu'un a-t-il des extraits de code recommandés?

Répondre

1

La propriété StandardOutput est de type StreamReader, qui possède des méthodes autres que ReadToEnd. Ce serait plus de code, mais si vous utilisiez la méthode Read, vous pourriez faire d'autres choses comme donner à l'utilisateur la possibilité d'annuler ou de signaler un type de progression.

lien pour lire Méthode d'exemple de code:

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

Edit:

La classe de procédé présente également un procédé BeginOutputReadLine qui est un appel de méthode asynchrone avec rappel.

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

+0

Ceci est à peu près tout, il suffit de lire en morceaux. – NibblyPig