UnityProband Geschrieben 27. Juni 2017 Melden Share Geschrieben 27. Juni 2017 Hallo liebe Unity Gemeinde! Ich hätte da mal eine Frage bezüglich eines Datenaustausch zwischen einer Konsolenanwendung, die in C++ geschrieben wurde, und einem Unity Projekt. Die einfachste Möglichkeit wäre es, dass ich das Konsolenprogramm per CMD starte und mit Hilfe von Unity auf die erzeugten double Werte zugreifen könnte. Momentan gibt das Konsolenprogramm die Daten auf der Konsole aus. Gibt es da eine einfache Möglichkeit, die Daten umzuleiten nach Unity. Habt Ihr vielleicht sogar Ideen? Ich wollte das mit Named Pipe realisieren, aber ich weiss jetzt nicht, ob Unity 5 überhaupt Named Pipes unterstützt? Also, einen C++ Server, der die Daten permanent sendet, und ein C# Client, der die Daten liest! Oder würde das viel simpler gehen? Über Vorschläge wäre ich sehr dankbar! VG Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 27. Juni 2017 Melden Share Geschrieben 27. Juni 2017 MemoryMappedFiles NamedPipes ConsoleIn/Out Gäbe es als Möglichkeiten. Wie du schon sagtest, bei NamedPipes bin ich mir nicht ganz sicher ob diese in Unity funktionieren, aber das einfachste wäre es, einfach mal eine Instanz entsprechend zu erstellen. Darf ich fragen wozu du extra eine C++ Anwendung schreiben willst? Du kannst in C# und auch in Unity (Basic/Pro) Native DLLs einbinden. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sneyke Geschrieben 27. Juni 2017 Melden Share Geschrieben 27. Juni 2017 Also wie es in C# geht weis ich nicht aus dem Stand. In Java startet man einen neuen Prozess ( new ProcessBuilder(bla.exe); ) und dann kann mit einem Inpustreamreader den Output von bla.exe auslesen. wenn du nach "c# run process and read output" googlest, kommen viele seiten wo sowas erklärt wird. Andere möglichkeit wäre "Shared memory". Damit hatte ich einer Firma zu tun die IBM Mainframes benutzt (und sich auf Bankensoftware spezialisiert hat). Da konnte man in COBOL auf geteilten Speicher zugreifen. War ne coole Sache. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
UnityProband Geschrieben 27. Juni 2017 Autor Melden Share Geschrieben 27. Juni 2017 Hallo! Danke für die Infos! Ich schaue mir das mal an! Eine entsprechende dll habe ich von der Konsolenanwendung schon erzeugt, aber leider hat das nicht funktioniert! Ich wollte die Imotiv Inside Brainwear unter Unity auslesen. Nicht die Raw Daten, sondern das Frequenzband. Das hat unter einer Konsolenanwendung funktioniert. Diese Konsolenanwendung wollte ich anschließend so modifizieren, dass diese als einer Art C++ Server funktioniert, der mir die Möglichkeit gibt auf die jeweiligen Daten unter Unity ran zu kommen Halt, durch eine Named Pipe, MemoryMappedFiles, Consolein/Out. Ich denke mal, dass ich mir diese Console in/out zuesrt anschaue! Hört sich ja schon gut an! VG Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 27. Juni 2017 Melden Share Geschrieben 27. Juni 2017 Ah, also ist es schon korrekt dass du eine Dll verwenden kannst. In dem Fall würde ich wirklich eher darauf eingehen anstatt die RPC Varianten. Was genau ging denn nicht? Ein RPC System aufzubauen ist eine interessante Sache aber so wie es klingt nicht ganz das was du hier brauchst. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
UnityProband Geschrieben 27. Juni 2017 Autor Melden Share Geschrieben 27. Juni 2017 Hallo! Die dll konnte ich ohne Probleme unter Unity einbinden. Die importierten Funktionen konnte ich unter Unity aufrufen , aber zeigten keine Wirkung! Unter der c++ Konsolenanwendung war das kein Problem! Ich weiss nicht, voran das lag! Das mit dem Aufbau eines RPC System ist ja auch toll, aber leider rennt mir die Zeit weg. Könnte ich nicht per Unity die externe c++ Anwendung als ein Thread starten und den Output unter Unity auslesen? Ich finde da nur was für c#! VG Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 27. Juni 2017 Melden Share Geschrieben 27. Juni 2017 Wenn die Zeit wegrennt dann lasse ich es mit dem einbinden der Dll, auch wenn es klar die bessere Lösung sein sollte Aber zu deiner Frage: https://stackoverflow.com/questions/285760/how-to-spawn-a-process-and-capture-its-stdout-in-net Eine externe Anwendung als extra Thread starten geht nicht, du kannst aber wie in dem link oben beschrieben eine externe Anwendung starten und den StdOut Stream abfangen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
UnityProband Geschrieben 27. Juni 2017 Autor Melden Share Geschrieben 27. Juni 2017 Hallo Mark! Danke für die Infos! Ich werde das mal ausprobieren! VG Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
UnityProband Geschrieben 28. Juni 2017 Autor Melden Share Geschrieben 28. Juni 2017 Hallo! Es funktioniert, aber nich so wie es haben will. Er startet die Applikation und Unity friert irgendwie ein? Wenn ich die Konsolenanwendung beende, dann geht Unity in die Game-Loop über und gibt mir auch den Konsolen-String aus! void Start(){ p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.FileName = pfad; output = p.StandardOutput.ReadToEnd(); UnityEngine.Debug.Log(output); p.Start();} Was mache ich falsch? Muss ich da eher einen Thread starten? Andere Frage : Funktioniert die Process - Funktionalität auch bei einer exe? VG Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 28. Juni 2017 Melden Share Geschrieben 28. Juni 2017 p.StandardOutput.ReadToEnd(); Liest den StdOut Stream zu ende, beendet ist der Stream wenn der gestartete Prozess beendet wird Process, ist nur eine Klasse welche eine Ausführbare Datei starten kann, also auch eine exe. private Process process; void Start() { process = new Process(); process.StartInfo.UseShellExecute = false; process.StartInfo.FileName = pfad; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.OutputDataReceived += ProcessDataReceived process.Start(); } // ACHTUNG: Nebenthread! private void ProcessDataReceived(object sender, DataReceivedEventArgs args) { UnityEngine.Debug.Log(args.Data); } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
UnityProband Geschrieben 28. Juni 2017 Autor Melden Share Geschrieben 28. Juni 2017 Hallo Mark! Danke für das Code-Schnipsel! Aber jetzt gibt er gar nichts mehr aus! Auch wenn ich die Konsolenanwendung beende! Aber trotzdem, Danke! VG Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 28. Juni 2017 Melden Share Geschrieben 28. Juni 2017 Ups, das war mein Fehler, nach dem process.Start() fehlt noch: process.BeginOutputReadLine(); Zusätzlich kann es sein (muss aber nicht) dass der Nebenthread kein Debug.Log benutzen darf, dann musst du eine Dispatchermechanik verwenden. --------- public class Dispatcher { private Queue<Action> actions = new Queue<Action>(); public void Dispatch(Action action) { lock (actions) { actions.Enqueue(action); } } public void HandleActions() { lock (actions) { while (actions.Count > 0) actions.Dequeue()(); } } } // Verwendung: Update einer Komponente: dispatcher.HandleActions(); // Hinzufügen neuer Actions vom Nebenthread aus: dispatcher.Dispatch(() => Debug.Log("Whooo MainThread!")); Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
UnityProband Geschrieben 28. Juni 2017 Autor Melden Share Geschrieben 28. Juni 2017 Hallo Mark! p.StandardOutput.ReadToEnd(); Danke, super Tipp Mark! Das war das Problem! Es funzt mit meinem geklauten Codebeispiel. Jetzt gibt er während die Konsolenanwendung starten, den String aus! VG Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.