LittleHacker (Member)
Guru
Messaggi: 1033
Iscritto: 28/04/2009
|
Salve a tutti ho un piccolo problema...Io dovrei prelevare dei valori da un'altro programma al difuori del mio cioè ad esempio un programma scritto in C++ quando è in eseguzione mi indica i valori 5 sotto la stringa "a:" e il valore 10 sotto la stringa "b:" come posso prelevare i valori 5 e 10? conoscendo le stringhe dove sono i valori...mi potete aiutare????? Grazie
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Cosa significa il "valore sotto la stringa"? Hai un dizionario? Un albero? Una lista? Due array? Un'istruzione cout?
Comunque, se devi leggere la memoria di processo, in Vista non si può fare.
|
|
LittleHacker (Member)
Guru
Messaggi: 1033
Iscritto: 28/04/2009
|
Io vorrei prendere dal programma ffmpeg dei valori che mi indichino la percentuale di avanzamento della conversione come posso fare?
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Ma al posto di fare esempi campati per aria, non potevi subito dire quello che volevi fare? Devo sempre fare un mucchio di domande per sapere cosa pensa la gente.
In quel caso devi redirigere l'output del programma verso uno stream di memoria gestito dalla tua applicazione. C'è un esempio di come fare nei sorgenti di Wav Converter. E' necessario, però, che sia tu ad avviare il processo.
|
|
LittleHacker (Member)
Guru
Messaggi: 1033
Iscritto: 28/04/2009
|
Ok...Io l'avevo già visto il sorgente di Wav Converter ma nn riesco a capire...potresti spiegarmi???
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Codice sorgente - presumibilmente VB.NET |
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.WindowStyle = ProcessWindowStyle.Hidden P.StartInfo.UseShellExecute = False P.StartInfo.RedirectStandardError = True P.StartInfo.CreateNoWindow = True AddHandler P.ErrorDataReceived, AddressOf Process_DataReceived P.Start() P.BeginErrorReadLine()
|
Vedi, qua ho scritto StartInfo.RedirectStandardError = True: significa che i dati passati a stderr verranno redirezionati all'applicazione. La stessa cosa vale per RedirectStandardOutput (il tuo caso).
Dopo che il processo è iniziato, si deve richiamare BeginErrorReadLine (o BeginOutputReadLine) per comunicare di iniziare a prelevare i dati in arrivo sullo stream di errore (o di output). Questa è una procedura asincrona, quindi lavora su un thread separato. Quando vengono ricevuti nuovi dati, viene generato l'evento ErrorDataReceived (o OutputDataReceived): per ottenere tali dati, devi creare un nuovo gestore d'evento per quell'evento, come è scritto nel codice di cui sopra.
Codice sorgente - presumibilmente VB.NET |
Private Sub Process_DataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) '... End Sub
|
e.Data contiene i dati ricevuti. |
|
LittleHacker (Member)
Guru
Messaggi: 1033
Iscritto: 28/04/2009
|
Ok funziona alla grande grazie...ma adesso un'altro problema cioè:
in Nella Sub Process_DataReceived ho inserito due if per controllare quale stringa mi mostrava cioè se la stringa è: "Codifica audio fallita!" allora mi mostra il messaggio di errore invece se mi mostra un'altra stringa mi dice conversione terminata con successo! ma nel secondo if (visto che la stringa che mi indica il termine della conversione non è solo "Conversione terminata" ma un bel pò di stringa differenti) ho preso la stringa uguale per tutte le conversioni e l'ho inserita in un Containts o in uno StartWith o in un'IndexOf ma x tutti e 3 mi da sempre lo stesso errore cioè: Riferimento a un oggetto non impostato su un'istanza di oggetto...Il codice è questo:
Codice sorgente - presumibilmente Delphi |
If e.Data.Contains("video:") Then MessageBox.show("Conversione Terminata!") End If
|
|
|
Il Totem (Admin)
Guru^2
Messaggi: 3635
Iscritto: 24/01/2006
|
Evidentemente, e.Data è Nothing... (anche se non dovrebbe, dato che l'evento viene generato quando si ricevono dei dati)
|
|
LittleHacker (Member)
Guru
Messaggi: 1033
Iscritto: 28/04/2009
|
Postato originariamente da Il Totem:
Evidentemente, e.Data è Nothing... (anche se non dovrebbe, dato che l'evento viene generato quando si ricevono dei dati) |
Ma se ad esempio la conversione genera un'errore mi dice che la conversione è stata interrotta e quindi non è possibile che e.Data sia Nothing...
Edit:
Risolto...avevi ragione totem..il e.Data alcune volte è null perciò mi dava questo errore, mi è bastato fare così:
Codice sorgente - presumibilmente VB.NET |
ElseIf e.Data <> "" Then If e.Data.Contains("video:") Then 'etc. End If End If
|
Grazie per l'aiuto... Ultima modifica effettuata da LittleHacker il 02/12/2009 alle 15:20 |
|