2016-07-13 5 views
4

ich einen MATLAB-Skript, das eine ausführbare Datei (geschrieben in C++) mit dem system() Befehl, wie so ruft: kann dauert ziemlich lange (bis zu mehreren Stunden)Wie kann ich MATLAB system() oder dos() bekommen, um die Konsolenausgabe in Echtzeit anzuzeigen?

exe_status = system('MySimulation.exe', arguments); 

Da die ausführbaren Datei auszuführen, I einschließlich einer Funktion, die die verbleibende Zeit schätzt und diese an die Konsole ausgibt. Wenn ich die ausführbare Datei außerhalb von MATLAB, die Windows-Konsole laufen ungefähr wie folgt aussieht:

Simulation #B01 initiated... 
Completion: 0.57% Time remaining: 183 m 2 s 

Mit dem \r Charakter, schreibt die „Vollendung“ Linie selbst jede Sekunde. Das funktioniert wirklich gut und lässt mich wissen, wann ich zurückkommen muss, um die Daten zu analysieren.

Leider hat das Aufrufen der ausführbaren Datei von der MATLAB-Konsole nicht den gleichen Effekt. MATLAB wartet, bis die ausführbare Datei beendet ist, bevor überhaupt eine Konsolenausgabe angezeigt wird, was meinen Timer unbrauchbar macht.

Ich habe die folgenden Befehle versucht, aber sie haben alle das gleiche Verhalten:

exe_status = system('MySimulation.exe', arguments); 
exe_status = system('MySimulation.exe', arguments, '-echo'); 
exe_status = dos('MySimulation.exe', arguments); 
exe_status = dos('MySimulation.exe', arguments, '-echo'); 

Wenn ich falsch bin lesen, scheint es, dass die MATLAB documentation legt nahe, dass '-echo' verwendet werden kann, die Befehlsausgabe Echo während die ausführbare Datei noch läuft, aber es hat keine Auswirkungen auf mein spezielles Programm.

+1

Was haben Sie bekommen, wenn Sie etwas wie 'system ('ping google.com')' 'versuchen? Hast du am Ende des Ping-Tests auch alles bekommen? Wenn es kein Problem für Sie ist, sollten Sie vielleicht jedes Mal eine neue Zeile drucken ... – obchardon

+0

@obchardon Das tue ich eigentlich nicht; Es wird sequenziell an die Konsole ausgegeben. Soweit ich das beurteilen kann, verhält sich das System ("ping google.com") genau so wie "ping google.com" in der Windows-Konsole. – Jim

+0

@obchardon Drucken der Abschlussinformationen als eine neue Zeile (einschließlich der "\ n" Zeichen) hilft nicht - alle Zeilen werden am Ende der ausführbaren Datei gedruckt. – Jim

Antwort

1

Ich nehme an, meine ursprüngliche Frage wurde zu wörtlich formuliert - ich fand eine Lösung durch Basteln mit dem C++ - Code anstelle des MATLAB-Codes. Insbesondere habe ich std::endl oder std::flush an den Enden der Konsole Druckbefehle, etwa so:

std::cout << "Simulation #B01 initiated..." << std::endl; 

Meine Vermutung ist, dass der Strom Spülung fordert MATLAB Inhalt des Streams an die Konsole in „Echtzeit“ angezeigt werden (mehr oder weniger), was die Windows-Konsole auf meinem bestimmten Computer mit meinem speziellen Betriebssystem nicht benötigt. Ich bin mir sicher, dass es hier irgendwo eine Lektion über die Portabilität gibt, aber ich weiß nicht annähernd genug darüber, was ich ' m tun, um es richtig zu gestalten.

Als eine Randnotiz habe ich festgestellt, dass MATLAB does not properly recognize the carriage return character \r in the console. Um meine ausführbare Datei mit potenziell Tausende von Zeilen von aktualisierten Status von Spamming die Konsole zu verhindern, habe ich meine alte Update-Line-Funktion

void time_remaining(...) { 

    std::string completion_update = (...); 

    std::cout << completion_update << "\r"; 

} 

mit einem etwas komplexeren ein

int time_remaining(string_length, ...) { 

    for(i = 0; i < string_length; i++) std::cout << "\b"; 

    std::string completion_update = (...); 

    std::cout << completion_update << std::flush; 

    string_length = completion_update.length(); 

    return string_length; 

} 

ersetzt, beruht auf das Backspace-Zeichen \b und die Zeichenlänge der vorherigen Iteration der Zeichenfolge completion_update.

1

Ich wurde neugierig, also habe ich ein paar Dinge ausprobiert. Ich habe versucht, ein Bash-Skript, eine c-ausführbare Datei und ein Python-Skript, und alle von ihnen zeigen ihre Ausgabe das Matlab-Befehlsfenster in "Echtzeit", das ist das gewünschte Verhalten für die Frage. Ich konnte die in der Frage beschriebene Situation nicht wiederherstellen. So

Ich vermute, entweder:

a) dass das, was Methode Sie die gleiche Linie auf Überdrucken verwenden, ist das Problem. Es ist möglicherweise nicht die Verwendung von \r, es könnte sich auf die spezifische Druckmethode beziehen, die Sie in Ihrer ausführbaren C++ - Datei verwenden. Ich würde versuchen, keinen Überdruck zu verwenden, und drucke einfach den Status auf einer neuen Zeile mit der einfachsten Druckanweisung, die du dir vorstellen kannst.

oder

b) ist das Problem OS spezifisch.

Für Vollständigkeit, hier sind die Details über das, was ich versuchte, und die Ergebnisse (Umwelt und print-Anweisung):

  1. Bash-Skript; echo ""
  2. kompilierter c-Code; printf("\n")
  3. Python 2.7 Skript; print("".format())
  4. os Einbau-ping Programm (wie in den Kommentaren beschrieben)

Ich lief dies in Matlab, mit dem system Befehl, zum Beispiel system('./timer_out');. In allen Fällen:

-Die gedruckte Ausgabe erschien "in Echtzeit", wenn es keine zweite Ausgabevariable gab, ungeachtet der Verwendung des '-echo'-Flags oder des abschließenden Semikolons, z.:

tic; system('./timer_out'); toc 

-Printed Ausgabe unterdrückt wurde, wenn eine Ausgangsgröße gegeben wurde, zum Beispiel:

tic; [s,r]=system('./timer_out'); toc 

-Printed Ausgabe in Echtzeit erscheint, wenn eine Ausgangsgröße und die '-echo' gegeben wurde, Beispiel:

tic; [s,r]=system('./timer_out','-echo'); toc 

Dieses Verhalten entspricht der Dokumentation. Diese Tests verwendeten Matlab R2015b unter OS X.

+0

Nun, Ich kann den Überdruck als Ursache des Problems ausschließen. Ich habe die Update-Zeile "completion" deaktiviert und das MATLAB-Konsolenverhalten nicht beeinflusst. Ich habe Druckanweisungen sowohl vor als auch nach der Simulation, die ungefähr eine Minute dauert.Beide Anweisungen erscheinen immer noch gleichzeitig, etwa eine Minute nach dem Start der ausführbaren Datei. Vielen Dank für die Details. Ich versuche jedoch, die Schritte zu wiederholen, die Sie unternommen haben, um das Problem einzugrenzen. Für den Rekord, ich laufe auf Windows 7. – Jim

Verwandte Themen