Jump to content
Unity Insider Forum

Datenaustausch zwischen Konsolenprogramm


UnityProband

Recommended Posts

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

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

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

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

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

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

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

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

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...