Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [VB2005] Problema ridirezionamento stdout

    Sto cercando di ridirezionare lo standard output di un'applicazione console, eseguita da linea di comando (lame.exe, di Lame Project). Ho trovato degli ottimi esempi in rete, e li ho seguiti confidando che funzionassero. Ahimé, ho sperato invano, perchè non riesco a trovare una motivazione soddisfacente a quello che invece si verifica. Una volta scritto un codice simile a quello proposto su msdn, e avviato correttamente il processo, mi sono accorto che l'evento DataReceived non viene generato affatto, o, al massimo, viene generato una sola volta con e.Data = Nothing. Ho provato anche a togliere WaitForExit ed usare un codice del genere:
    codice:
    Do
        Dim S As String = P.StandardOutput.ReadLine()
        If Not String.IsNullOrEmpty(S) Then
          W.WriteLine(S) 'W è uno stream di testo che uso per vedere se ci sono messaggi
        End If
    Until P.HasExited 'P è il Process
    Nonostante ciò, non ottengo mai niente, eppure l'output di lame.exe è consistente ed esiste. Qualche suggerimento?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Puoi postare tutto il codice che hai scritto (compresa la creazione del processo) per poterlo provare ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Dato che ora l'ho cancellato, lo riscrivo a memoria:
    codice:
        Private W As IO.StreamWriter
    Private Sub bgConvert_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgConvert.DoWork
            Dim Info As ConvertInfo = e.Argument
            Dim Lame As String = Application.StartupPath & "\lame.exe"
            Dim P As Process
            Dim Index As Int32 = 0
    
            bgConvert.ReportProgress(0, Info.Files.Count)
            For Each File As String In Info.Files
                P = New Process
                P.StartInfo.FileName = Lame
                P.StartInfo.Arguments = Info.Arguments & String.Format("{0}{1}{0} {0}{2}{0}", Chr(34), File, Info.Folder & "\" & IO.Path.GetFileNameWithoutExtension(File) & ".mp3")
                P.StartInfo.UseShellExecute = False
                P.StartInfo.RedirectStandardOutput = True
                P.StartInfo.CreateNoWindow = True
                W = New IO.StreamWriter("output.txt")
                AddHandler P.DataReceived, AddressOf Process_DataReceived
                P.Start()
                P.BeginOutputReadLine()
                P.WaitForExit()
                RemoveHandler P.DataReceived, AddressOf Process_DataReceived
                W.Close()
                Index += 1
                bgConvert.ReportProgress(Index, Info.Files.Count)
            Next
        End Sub
    
        Private Sub Process_DataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
            W.WriteLine(e.Data)
        End Sub
    Grossomodo era questo.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    A quanto ho capito, lame usa lo Standard Error ... quindi prova con

    codice:
    P.StartInfo.RedirectStandardError = True
    ...
    AddHandler P.ErrorDataReceived, AddressOf Process_DataReceived
    ...
    P.BeginErrorReadLine()
    ...
    RemoveHandler P.ErrorDataReceived, AddressOf Process_DataReceived
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Il Totem
    Ottimo, così va bene, grazie!
    Di nulla ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.