Elina: Danke für deine Antwort. Es gibt einige Notizen am unteren Rand dieses MSDN-Dokuments (msdn. microsoften-uslibraryhellip), die vor potenziellen Deadlocks warnen, wenn Sie das Ende der beiden umgeleiteten Stdout - und Stderr-Streams synchron lesen. Es ist schwer zu sagen, ob Ihre Lösung anfällig für dieses Problem ist. Auch scheint es, dass Sie den Prozess39 stdoutstderr Ausgang rechts zurück als Eingang senden. 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 ist einfach und besser Ansatz (wir brauchen nicht AutoResetEvent): Antwort # 2 am: Mai 12, 2010, 10:12: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 Sie statt der Verwendung von Ereignis (wenn sie verfügbar sind) abstimmen, dann verwenden Sie CPU ohne Grund und dass Sie sind ein schlechter Programmierer. Ihre Lösung ist wirklich schlecht, wenn die anderen mit AutoResetEvent verglichen werden. (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 jedoch unter Windows 8, aber nicht unter Windows 7 auftreten. Die folgende Zeile scheint das Problem verursacht haben. Die Lösung war, NICHT deaktivieren UseShellExecute. Ich erhielt nun ein Shell-Popup-Fenster, das unerwünscht ist, aber viel besser als das Programm wartet auf nichts Besonderes passieren. So fügte ich die folgenden Work-around für das: Jetzt ist das einzige, was mich stört, warum dies geschieht unter Windows 8 an erster Stelle. Ich habe versucht, eine Klasse, die Ihr Problem mit Hilfe von asynchronen Stream zu lösen, indem Sie in Konto Mark Byers, Rob, stevejay Antworten lösen würde. 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 weitergeleitet oder der Prozess hat noch nicht begonnen. Danach müssen Sie die asynchrone Ausgabe starten, die nach dem Start des Prozesses gelesen wird. Führen Sie deshalb eine Racebedingung aus, da der Ausgabestream Daten empfangen kann, bevor Sie ihn auf asynchron setzen. Dann könnten einige Leute sagen, dass Sie nur den Stream vor Ihnen lesen müssen Setzen Sie es auf asynchron. Aber das gleiche Problem tritt auf. Es wird eine Racebedingung zwischen dem synchronen Lesen und dem Setzen des Streams in den asynchronen Modus geben. 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 von anderen Benutzern für Ihren Fall vorgeschlagen. Aber Sie sollten sich bewusst sein, dass Sie einige Informationen aufgrund Rennen Bedingung verpassen könnte. Ich habe eine Anwendung (C-Desktop-Anwendung), die aus einer anderen c-Anwendung gestartet wird. Für die Übergabe von Wert von übergeordneten App auf die untergeordnete App verwenden wir eine Textdatei. Die übergeordnete App vor dem Starten schreibt die Werte in eine Textdatei und die untergeordnete App liest sie. Die untergeordnete App verarbeitet den Wert und berechnet ein Ergebnis. Problem: Sobald der Benutzer die untergeordnete App schließt, muss die übergeordnete App benachrichtigt werden, dass der andere Prozess nah ist, sodass die übergeordnete App Werte aus einer anderen Textdatei, die von untergeordneten Apps mit den Ergebniswerten aktualisiert wurde, lesen kann. Jetzt bin ich nicht ganz sicher, wie wir dies auf einfache Weise erreichen können. Die Architektur kann nicht geändert werden. Vielen Dank im Voraus. Freundliche Grüße. Mittwoch, 27. April, 2016 17.42 Ich würde nicht eine Textdatei für diese. Ich würde Named Pipes verwenden. Jedenfalls, um den zweiten Bewerbungsprozess zu benachrichtigen, würde ich System oder globale benannte Mutexes verwenden. Sie können auf diese Mutex von beiden Prozessen zugreifen. Ein Prozess kann es setzen und der andere Prozess darauf wartet. Vorgeschlagen als Antwort von Konrad Neitzel Donnerstag, 28. April 2016 05:18 Als Antwort markiert von Kristin Xie Microsoft Kontingent Mitarbeiter, Moderator Freitag, 06. Mai 2016 01:19 Mittwoch, 27. April 2016 18:45 There different ways Zwischen Prozessen zu kommunizieren. Hier sind einige Optionen für Sie zu erforschen und zu bewerten gegen Ihre spezifischen Anforderungen: Die Kind-Anwendung sollte eine Nachricht an die übergeordnete Anwendung senden, mit welcher Technik Sie wählen, nur bevor es heruntergefahren wird. Zum Beispiel in der Form. Closing-Ereignis: msdn. microsoften-uslibrarysystem. windows. forms. form. closing28vvs.11029.aspx Hoffe, dass hilft. Bitte denken Sie daran, Ihre Threads zu schließen, indem Sie hilfreiche Beiträge als Antwort markieren und dann einen neuen Thread starten, wenn Sie eine neue Frage haben. Bitte fragen Sie nicht mehrere Fragen im selben Thread. Vorgeschlagen als Antwort von Konrad Neitzel Donnerstag, 28. April 2016 05:17 Als Antwort markiert von Kristin Xie Microsoft Kontingent Mitarbeiter, Moderator Freitag, 06. Mai 2016 01:19 Mittwoch, 27. April 2016 08:32 Uhr Usually you start Die untergeordnete App über Process. Start (). Wich bedeutet auch, dass Sie leicht warten können, bis der Prozess mit Process. WaitForExit () beendet wird. Wenn die übergeordnete Anwendung eine GUI hat und das Kind irgendeine menschliche sichtbare Zeit für die Verarbeitung benötigt, wird es schwierig, weil das WaitForExit den GUI-Thread aufgrund eines Blockieraufrufs sperren würde. Multitasking oder Threading wäre erforderlich, um die übergeordnete App in diesem Fall hinzugefügt werden. Aber das ist eine seperate Angelegenheit insgesamt und sollte als separate Frage zurückgefordert werden. Dies ist jedoch ein sehr schlechter Weg, um die Kommunikation zwischen den Prozessen zu tun. Finden Sie einen Ort, wo Sie eine Datei schreiben kann sehr schwierig sein. Als mater natürlich, nur immer asume schreibe Rechte auf die Special Folders des Benutzers. Rufen Sie den Pfad über die Spezialfolder-Enumeration ab. Eine leichte Verbesserung wäre, die Dateinamen (für Input-und Output-Datei) über Kommandozeilenparameter geben, sondern dann hardcode es. Vielleicht sogar die vollständige Eingabe über Parameter (wenn möglich innerhalb der Kommandozeilen-Constraints). Für ernsthafte Interprozess-Kommunikation sollten Sie für jeden der dedizierten appraoch gehen: Netzwerk-Kommunikation, die auf das Loopback-Gerät. Named und Unbenannte Pipes im Nachrichtenmodus. MemoryMapped-Datei oder gemeinsam genutzten Speicher. Es gibt eine ganze Reihe von richtigen Ansätze für IPC mit einer Menge der Sanitär für Sie gesorgt. Die Zeiten, in denen Sie Ihre eigenen Sockel-Programmierung nur für einige IPC tun müssen, sind längst vorbei. Und die anderen Plakate erklären ihnen recht gut. Vorgeschlagen als Antwort von Konrad Neitzel Donnerstag, 28. April 2016 05:17 Als Antwort markiert von Kristin Xie Microsoft Kontingent Mitarbeiter, Moderator Freitag, 06. Mai 2016 01:19 Uhr Hier sind einige Optionen für Sie zu erforschen und zu bewerten gegen Ihre spezifischen Anforderungen: Die untergeordnete Anwendung sollte eine Nachricht an die übergeordnete Anwendung senden mit welcher Technik Sie wählen, nur bevor es heruntergefahren wird. Zum Beispiel in der Form. Closing-Ereignis: msdn. microsoften-uslibrarysystem. windows. forms. form. closing28vvs.11029.aspx Hoffe, dass hilft. Bitte denken Sie daran, Ihre Threads zu schließen, indem Sie hilfreiche Beiträge als Antwort markieren und dann einen neuen Thread starten, wenn Sie eine neue Frage haben. Bitte fragen Sie nicht mehrere Fragen im selben Thread. Vorgeschlagen als Antwort von Konrad Neitzel Donnerstag, 28. April 2016 05:17 Als Antwort markiert von Kristin Xie Microsoft Kontingent Mitarbeiter, Moderator Freitag, 06. Mai 2016 01:19 Mittwoch, 27. April 2016 08:32 Uhr Usually you start Die untergeordnete App über Process. Start (). Wich bedeutet auch, dass Sie leicht warten können, bis der Prozess mit Process. WaitForExit () beendet wird. Wenn die übergeordnete Anwendung eine GUI hat und das Kind irgendeine menschliche sichtbare Zeit für die Verarbeitung benötigt, wird es schwierig, weil das WaitForExit den GUI-Thread aufgrund eines Blockieraufrufs sperren würde. Multitasking oder Threading wäre erforderlich, um die übergeordnete App in diesem Fall hinzugefügt werden. Aber das ist eine seperate Angelegenheit insgesamt und sollte als separate Frage zurückgefordert werden. Dies ist jedoch ein sehr schlechter Weg, um die Kommunikation zwischen den Prozessen zu tun. Finden Sie einen Ort, wo Sie eine Datei schreiben kann sehr schwierig sein. Als mater natürlich, nur immer asume schreibe Rechte auf die Special Folders des Benutzers. Rufen Sie den Pfad über die Spezialfolder-Enumeration ab. Eine leichte Verbesserung wäre, die Dateinamen (für Input-und Output-Datei) über Kommandozeilenparameter geben, sondern dann hardcode es. Vielleicht sogar die vollständige Eingabe über Parameter (wenn möglich innerhalb der Kommandozeilen-Constraints). Für ernsthafte Interprozess-Kommunikation sollten Sie jedoch für jeden der dedizierten appraochs gehen: Netzwerk-Kommunikation, die auf das Loopback-Gerät. Named und Unbenannte Pipes im Nachrichtenmodus. MemoryMapped-Datei oder gemeinsam genutzten Speicher. Es gibt eine ganze Reihe von richtigen Ansätze für IPC mit einer Menge der Sanitär für Sie gesorgt. Die Zeiten, in denen Sie Ihre eigenen Sockel-Programmierung nur für einige IPC tun müssen, sind längst vorbei. Und die anderen Plakate erklären ihnen recht gut. Vorgeschlagen als Antwort von Konrad Neitzel Donnerstag, 28. April 2016 05:17 Als Antwort markiert von Kristin Xie Microsoft Kontingent Mitarbeiter, Moderator Freitag, 06. Mai 2016 01:19 Mittwoch, 27. April 2016 10:03
No comments:
Post a Comment