Thursday 16 March 2017

Waitforexit Beispiel C Programmierung


Wie permanent ist WaitForExit (). Ich meine, es gibt irgendetwas eine Alternative, die man tun kann, um das Warten zu brechen, sonst werde ich meinen Thread in einer separaten Funktion ausführen und es durch globale Variablen steuern. Grund - ein CMD. EXE-Thread, mit einer Konsolen-Anwendung läuft, die wir vor dem Faden, der seinen Kurs läuft, abbrechen muss. Hier ist was wir haben: ProcessStartInfo psi new ProcessStartInfo (quotCMD. EXEquot, query) psi. UseShellExecute useShellExec psi. RedirectStandardOutput stdout psi. CreateNoWindow noWindow hbProc new Process () hbProc Process. Start (psi) hbProc. WaitForExit () Nun, könnte man Verwenden Sie: while (hbProc. WaitForExit (someTimeout)) if (ShouldCancel) brechen am Sep 19, 5:15 am, quotMarc Gravellquot ltmarc. grav. Gt schrieb: gt Nun könnten Sie: gt gt while (hbProc. WaitForExit (someTimeout)) gt if (ShouldCancel) brechen gt gt gt gt Marc (beachten Sie, es gibt keinen Grund, den neuen Prozess () und den Prozess aufzurufen. Start (psi) Oder du könntest: hbProc new process () hbProc. EnableRaisingEvents true hbProc. Exited new EventHandler (functionToCallAfterProcesit) hbProc. StartInfo psi hbProc. Start () andere Thread - on will das Ereignis abbrechen: hbProc - new EventHandler ( FunctionToCallAfterProcesit) In jedem Fall ist nur bewusst sein, die potenzielle Race-Bedingung zwischen dem Prozess verlassen und der Wunsch, das Warten abzubrechen. Am 19. September, 4:11 Uhr, Alistair George ltnon xtra. co. nzgt schrieb: gt Wie dauerhaft ist WaitForExit () Ich meine, es gibt alles was gt Alternative kann man tun, um das Warten zu brechen, sonst werde ich meinen Thread gt in einer separaten Funktion laufen und kontrolliere es durch globale Variablen. Gt Reason - ein CMD. EXE Thread mit einer Konsole Anwendung laufen, die wir gt müssen, um vor dem Faden, der seinen Kurs läuft, zu stornieren. Gt Hier ist was wir haben: gt ProcessStartInfo psi new gt ProcessStartInfo (quotCMD. EXEquot, Abfrage) gt psi. UseShellExecute useShellExec gt psi. RedirectStandardOutput stdout gt psi. CreateNoWindow noWindow gt hbProc new Process () gt hbProc Process. Start (psi) gt HbProc. WaitForExit () gt gt Danke, gt Alistair. Sie können entweder den Thread mit WaitForExit () töten oder die Überladung verwenden, mit der Sie ein Timeout bool WaitForExit (int msToWait) angeben können. Wenn du es in einem separaten Thread betreibst und es töten wirst du eine unterbrochene Ausnahme bekommen. Vielleicht möchten Sie sicherstellen, dass der Prozess, den Sie begonnen haben, nicht noch läuft (wenn es ist, töte es). Gt Du kannst entweder den Thread mit WaitForExit () töten oder die gt-Überladung verwenden, mit der du einen Timeout bool WaitForExit (int gt msToWait) angeben kannst. Wenn Sie es in einem separaten Thread laufen und es töten, werden Sie eine unterbrochene Ausnahme bekommen. Vielleicht möchten Sie sicherstellen, dass der gt-Prozess, den Sie begonnen haben, nicht noch läuft (wenn es ist, töte es). Gt Danke Jungs mit den Vorschlägen, die nützlich sind. Wird raten, welche Option am besten funktioniert Al Copyright Kopie 2005-2016, TechTalkz. Alle Rechte vorbehalten. Elina: Danke für deine Antwort. Es gibt einige Notizen am unteren Rand dieses MSDN-Dokuments (msdn. microsoften-uslibraryhellip), die über potenzielle Deadlocks warnen, wenn Sie bis zum Ende der beiden umgeleiteten Stdout - und Stderr-Ströme synchron lesen. Es ist schwer zu sagen, ob Ihre Lösung anfällig für dieses Problem ist. Außerdem scheint es, dass du die process39 stdoutstderr Ausgabe direkt als Eingang sendest. Warum. ) Ndash Matthew Piatt Dies ist eine moderne, TPL-basierte Lösung (Task Parallel Library, TPL) basierte Lösung für 4.5 und höher. Antwort # 2 am: Juli 12, 2010, 07:10:13 am »Ich Sache, dass dies einfach und besser Ansatz (wir brauchen nicht AutoResetEvent): Antwort # 2 am: Mai 12, 2010, 10:49:13 pm» True, aber shouldn39t Sie tun. FileName Pfad quotggsci. exequot lt Obeycommand. txtquot, um Ihren Code zu zu vereinfachen Oder vielleicht etwas gleichbedeutend mit quotecho Befehl quotieren Pfad quotggsci. exequot, wenn Sie wirklich don39t eine separate obeycommand. txt-Datei verwenden möchten. Ndash Amit Naidu Ihre Lösung braucht nicht AutoResetEvent aber Sie Umfrage. Wenn du anstelle von Event-Event (wenn sie verfügbar sind), dann sind Sie mit CPU ohne Grund und das deuten darauf hin, dass Sie ein schlechter Programmierer sind. Ihre Lösung ist wirklich schlecht, wenn mit dem anderen mit AutoResetEvent verglichen. (Aber ich habe dir nicht gegeben, weil du versucht hast zu helfen). Ndash Eric Ouellet Ich war mit dem gleichen Problem, aber der Grund war anders. Es würde aber unter Windows 8 passieren, aber nicht unter Windows 7. Die folgende Zeile scheint das Problem verursacht zu haben. Die Lösung bestand darin, UseShellExecute NICHT zu deaktivieren. Ich habe jetzt ein Shell Popup-Fenster, das ist unerwünscht, aber viel besser als das Programm wartet auf nichts Besonderes passieren. So fügte ich das folgende Work-around hinzu: Jetzt das einzige, was mich stört, ist, warum dies geschieht unter Windows 8 an erster Stelle. Antwortete 13. Januar 15 um 10:35 Ich habe versucht, eine Klasse, die Ihr Problem mit asynchronen Stream zu lösen, zu lesen, indem Sie in Rechnung Mark Byers, Rob, stevejay Antworten zu machen. Dabei erkannte ich, dass es einen Fehler im Zusammenhang mit asynchrone Prozess-Ausgabe-Stream zu lesen. Sie können das nicht tun: Sie erhalten System. InvalidOperationException. StandardOut wurde nicht umgeleitet oder der Prozess hat noch nicht begonnen. Dann müssen Sie die asynchrone Ausgabe starten, nachdem der Prozess gestartet wurde: So machen Sie eine Racebedingung, da der Ausgabestream Daten empfangen kann, bevor Sie ihn auf asynchron einstellen: Dann könnten einige Leute sagen, dass Sie nur den Stream vor Ihnen lesen müssen Setze es asynchron an. Aber das gleiche Problem tritt auf. Es wird eine Race-Bedingung zwischen dem synchronen Lesen und setzen den Stream in den asynchronen Modus. Es gibt keine Möglichkeit, das sichere asynchrone Lesen eines Ausgabestreams eines Prozesses in der eigentlichen Weise zu erledigen. Process und ProcessStartInfo wurden entworfen. Sie sind wahrscheinlich besser mit asynchronen lesen wie vorgeschlagen von anderen Benutzern für Ihren Fall. Aber Sie sollten sich bewusst sein, dass Sie aufgrund der Rennbedingung einige Informationen verpassen könnten.

No comments:

Post a Comment