Monday 6 November 2017

Waitforexit C Shell Esempio


Come 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. Tutto il codice Diritti riservati. Tutti assomiglia quasi questo: Come si può vedere, il codice avvia un processo cmd. exe e passa ad essa il comando che voglio da eseguire. Rioriento StandardError e StandarOutput per leggerli dal codice. Il codice li legge prima del processo. WaitForExit (Timeout) chiamata come raccomandato da Microsoft (ne parleremo più avanti). Il problema sorge se il comando mando a cmd. exe non termina o si blocca a tempo indeterminato. Nel codice che ho usato il comando ping - t 8.8.8.8 che, a causa del l'opzione - t, ping l'ospite senza fermarsi. Cosa succede Il processo cmd. exe insieme con il comando - t ping mai uscite e non chiude mai il flusso stdout e così il nostro codice si blocca al () Linea process. StandardOutput. ReadToEnd uscita perché cant riescono a leggere tutto il flusso. Lo stesso accade anche se un comando in un file batch si blocca per qualsiasi motivo e in modo che il codice di cui sopra potrebbe funzionare continuamente per anni e poi appendere improvvisamente senza alcun motivo apparente. Prima ho scritto che la sua consiglia di leggere i flussi reindirizzate prima del processo. WaitForExit (Timeout) chiamata, e questo è particolarmente vero se si utilizza la firma WaitForExit senza il timeout. Se si chiama processo. WaitForExit () prima di leggere i flussi reindirizzati: codice 2: si può sperimentare un deadlock se il comando si collega alla cmd. exe o il processo che si sta chiamando riempie l'output standard o standard error. Questo perché il nostro codice sopraelevazione raggiungere le linee di processo di uscita. StandardOutput. ReadToEnd () È un dato di fatto del processo figlio (il comando ping o un file batch o un processo che si sta eseguendo qualsiasi altra cosa) potete andare sul se il nostro programma di doesnt leggere i buffer piene dei corsi d'acqua e questo cant accadere perché il codice è appesa a la linea con processo. WaitForExit (), che aspettare per sempre per il progetto figlio per uscire. La dimensione predefinita di entrambi i flussi è di 4096 byte. È possibile verificare questo due dimensioni con questi file batch: Il primo script scrive 4096 byte standard output e il secondo di errore standard. Salvare uno di questi in C: testbuffsize. bat ed eseguire il nostro processo di programma chiamante. WaitForExit () prima del processo di uscita. StandardOutput. ReadToEnd (), come nel codice 2. è possibile farlo scrivendo CommandResult Risultato ExecuteShellCommandSync (c: testbuffsize. bat, 1000) alla riga 13 del codice 1. Il codice solito appendere ma se si scrive un altro byte in uno qualsiasi dei due corsi d'acqua che sarà traboccare la dimensione del buffer rendendo il programma appendere. Se avete bisogno di reindirizzare e leggere l'errore di uscita o standar di serie la soluzione migliore è quella di leggere in modo asincrono. Un ottimo modo per fare questo è proposto da Mark Byers in questa discussione StackOverflow come l'ultima cosa si prega di notare che se il processo figlio esce solo perché si utilizza il processo. WaitForExit (Timeout) firma e va effettivamente in timeout si dovrebbe uccidere il processo di cmd. exe e le sue possibili figli.

No comments:

Post a Comment