Ciao, Sto sviluppando un'applicazione console C che inizia una linea di comando e ottiene alcuni dati attraverso un altro comando (che è irrilevante in questa discussione). Alla fine mi metterò alcuni dati nella riga di comando e ho solo bisogno solo l'ultima riga di questo. Ho usato il seguente codice: Process. StartInfo. FileName quotcmd. exequot Process. StartInfo. RedirectStandardInput vero Process. StartInfo. RedirectStandardOutput vero ho usato Process. StandardInput. WriteLine di scrivere i comandi ho bisogno di console. Ma se Process. StartInfo. RedirectStandardOutput vero, non sto ottenendo l'uscita richiesto utilizzando il Process. StandardOutput. ReadToEnd economico (). Split (n) considerando che l'opzione ReadLine sta lavorando bene e io sono sempre la prima riga del testo visualizzato. Dal momento che ogni volta i dati che salgo sul differisce console, non posso hardcode qualsiasi minut specifica da dove per ottenere la mia uscita. Anche se ho messo un orologio sul Process. StandardOutput. ReadToEnd dichiarazione (). Split (n) Sto ottenendo un'eccezione di timeout funzione. Gentilmente mi aiutare con questo problema. Giovedi, mese di agosto 07, 2008 5:44 Così ho copiato il codice Manjus. quotcmd. exequot Myprocesss. In primo luogo, ho inviato il comando quotipconfigquot, con un ReadToEnd () Tempo scaduto. Ho provato a leggere in blocchi, non è riuscito troppo. Provato waitForInputIddle (), ma ha dimenticato cmd non ha alcuna interfaccia grafica, non è riuscito troppo. Quindi ho bisogno del cmd per porre fine al flusso se volevo leggere mai esso. Ok così esco così ho provato l'invio di tutti i miei comandi, tra cui il comando exit prima, quindi la lettura. sIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig allquot) sIn. WriteLine (quotexitquot) stringa strOutput sOut. ReadToEnd () funziona come un fascino. Il mio ReadToEnd () restituisce una stringa in mezzo secondo, e ho avuto tutte le informazioni che ho bisogno. -) Potrebbe essere di alcun aiuto a voi, Gauri L'improbabile che facciamo, l'impossibile vuole solo un po 'di più. - Steven Parker Contrassegnato come risposta da Jack 321 Lunedi, 11 mese di agosto, 2008 05:44 Giovedi, mese di agosto 07, 2008 7:51 ReadToEnd () è suscettibile di causare stallo, soprattutto quando si codifica dopo un WaitForExit () o inviare un sacco di input. Il processo sta scrivendo la sua uscita di un buffer, tale buffer non sta molto grande (2 KB credo). E andate altrove leggere il contenuto di questo buffer, diciamo wiith ReadLine (), il processo di stallo, in attesa che il buffer di essere svuotato. Il vostro programma a sua volta in stallo dal WaitForExit () non potrà mai restituire o la chiamata WriteLine () in stallo dal momento che il processo non è più è la lettura di ingresso. Se questo è lo scenario, youll bisogno di leggere in modo asincrono con BeginOutputReadLine (). Hans Passant. Contrassegnato come risposta da Jack 321 Lunedi, mese di agosto 11, 2008 05:44 Giovedi, mese di agosto 07, 2008 12:13 Tutte le risposte È inoltre necessario impostare Process. StartInfo. UseShellExecute su false. Contrassegnato come risposta da Jack 321 Lunedi, 11 mese di agosto, 2008 05:43 È possibile che questo è un bel risposta standard, tuttavia. Non penso che il quotcmdquot conclude il flusso. Non c'è niente di essere inviati dal cmd-box per indicare che il flusso è finita. Si consideri una pagina web che si carica, una volta che l'intero codice html ha raggiunto il PC, il flusso è fatto. Stessa cosa con la lettura di un file, una volta raggiunto l'ultimo carattere, il flusso è fatto. Tuttavia, con cmd, il quotdonequot flusso isnt. Si aspetta solo per nuovo input, quindi se si dà un altro comando, avrà ancora una volta in uscita. Hmm mi sembra di avere problemi esprimermi in inglese ancora una volta, le mie scuse. In ogni modo, non penso theres qualsiasi cosa si può fare per usare ReadToEnd () su un cmd-uscita-stream, a meno che non lo si invia il comando quotexitquot. Hai provato unendo la readline () con una. un'analisi della linea (cioè si ottiene righe vuote), oppure b. comandare il Process. WaitForIddleInput () L'improbabile che facciamo, l'impossibile richiede solo un po 'di più. - Steven Parker Giovedi, mese di agosto 07, 2008 07:35 Nel caso in cui si esegue processo cmd. Non ricordate di scrivere quotEXITquot nel flusso di input Giovedi, mese di agosto 07, 2008 7:51 Così ho copiato il codice Manjus. quotcmd. exequot Myprocesss. In primo luogo, ho inviato il comando quotipconfigquot, con un ReadToEnd () Tempo scaduto. Ho provato a leggere in blocchi, non è riuscito troppo. Provato waitForInputIddle (), ma ha dimenticato cmd non ha alcuna interfaccia grafica, non è riuscito troppo. Quindi ho bisogno del cmd per porre fine al flusso se volevo leggere mai esso. Ok così esco così ho provato l'invio di tutti i miei comandi, tra cui il comando exit prima, quindi la lettura. sIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig allquot) sIn. WriteLine (quotexitquot) stringa strOutput sOut. ReadToEnd () funziona come un fascino. Il mio ReadToEnd () restituisce una stringa in mezzo secondo, e ho avuto tutte le informazioni che ho bisogno. -) Potrebbe essere di alcun aiuto a voi, Gauri L'improbabile che facciamo, l'impossibile vuole solo un po 'di più. - Steven Parker Contrassegnato come risposta da Jack 321 Lunedi, 11 mese di agosto, 2008 05:44 Giovedi, mese di agosto 07, 2008 7:51 ReadToEnd () è suscettibile di causare stallo, soprattutto quando si codifica dopo un WaitForExit () o inviare un sacco di input. Il processo sta scrivendo la sua uscita di un buffer, tale buffer non sta molto grande (2 KB credo). E andate altrove leggere il contenuto di questo buffer, diciamo wiith ReadLine (), il processo di stallo, in attesa che il buffer di essere svuotato. Il vostro programma a sua volta in stallo dal WaitForExit () non potrà mai restituire o la chiamata WriteLine () in stallo dal momento che il processo non è più è la lettura di ingresso. Se questo è lo scenario, youll bisogno di leggere in modo asincrono con BeginOutputReadLine (). Hans Passant. Contrassegnato come risposta da Jack 321 Lunedi, 11 mese di agosto, 2008 05:44 Giovedi, mese di agosto 07, 2008 12:13 Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione del sito Web MSDN. Se si sceglie di partecipare, il sondaggio on-line sarà presentato a voi quando si lascia il sito Web MSDN. Volete participateHow permanente è WaitForExit (). Voglio dire, c'è qualcosa di una alternativa può fare per rompere l'attesa altrimenti correrò il mio thread in una funzione separata, e controllarlo da variabili globali. La ragione - un filo CMD. EXE, con un'applicazione console in esecuzione, che abbiamo bisogno di cancellare fuori prima il filo conduttore il suo corso. Ecco quello che abbiamo: ProcessStartInfo psi nuova ProcessStartInfo (quotCMD. EXEquot, query) psi. UseShellExecute useShellExec psi. RedirectStandardOutput stdout psi. CreateNoWindow noWindow hbProc nuovo processo () hbProc Process. Start (psi) hbProc. WaitForExit () Beh, si potrebbe uso: mentre (hbProc. WaitForExit (someTimeout)) se (ShouldCancel) pausa il set 19, 5:15, quotMarc Gravellquot ltmarc. grav. gt ha scritto: gt Beh, si potrebbe usare: gt gt mentre (hbProc. WaitForExit (someTimeout)) gt se (ShouldCancel) rompere gt gt gt gt Marc (nota, non vi è alcun motivo per chiamare sia il nuovo processo () e il processo. Start (psi) o si può usare: hbProc nuovo processo () hbProc. EnableRaisingEvents vero hbProc. Exited nuova EventHandler (functionToCallAfterProcesit) hbProc. StartInfo psi hbProc. Start () altro thread - sulla desidera annullare evento: hbProc - new EventHandler ( functionToCallAfterProcesit) In entrambi i casi, basta essere consapevoli della condizione di potenziale gara tra il processo in uscita e il desiderio di annullare l'attesa il set 19, 4:11, Alistair George ltnon xtra. co. nzgt ha scritto:.. gt Come permanente è WaitForExit () voglio dire c'è qualcosa un'alternativa GT si può fare per rompere l'attesa altrimenti correrò il mio GT filo in una funzione separata, e controllarlo da variabili globali gt ragione -.. un filo CMD. EXE, con una console applicazione in esecuzione, che abbiamo Gt bisogno di cancellare fuori prima il filo conduttore il suo corso. gt Ecco ciò che abbiamo: gt ProcessStartInfo psi nuova GT ProcessStartInfo (quotCMD. EXEquot, query) gt psi. UseShellExecute useShellExec gt psi. RedirectStandardOutput stdout gt psi. CreateNoWindow noWindow gt hbProc nuovo processo () gt hbProc Process. Start (psi) gt hbProc. WaitForExit () gt gt Grazie, Alistair gt. È possibile uccidere il WaitForExit thread in esecuzione () o utilizzare l'overload che consente di specificare un timeout WaitForExit bool (int msToWait). Se si esegue in un thread separato e uccidere si sta andando ad ottenere un'eccezione interrotta. Si consiglia di assicurarsi che il processo è stato avviato non sta ancora in esecuzione (se lo è, ucciderlo). gt è possibile uccidere il WaitForExit thread in esecuzione () oppure utilizzare il sovraccarico di GT che permette di specificare un timeout WaitForExit bool (int gt msToWait). Se si esegue in un thread separato e uccide sei gt intenzione di ottenere un'eccezione interrotta. Si consiglia di assicurarsi che il processo di GT è stato avviato non sta ancora in esecuzione (se lo è, ucciderlo). ragazzi gt Grazie con i suggerimenti che sono utili. Vi consiglierà quale opzione ha funzionato meglio. Al. Copyright copia 2005-2016, TechTalkz. Tutti i diritti riservati.
No comments:
Post a Comment