Nicht blockierender Aufruf an ein externes Programm ohne Verlust des Rückgabecodes

8

Wenn ich das externe Programm (kurz "EX" genannt) aus Matlab heraus starte, kann ich es entweder so machen

%Vor%

was blockiert, bis EX zurückkehrt oder wie folgt

%Vor%

kehrt sofort zu Matlab zurück, kann jedoch den Rückkehrcode von EX nicht abrufen.

Es wäre schön, den Rückgabecode von EX in Matlab zu haben, sobald er fertig ist. Dies wäre der einfachste Weg für das aufrufende Matlab-Skript, irgendwelche Probleme zu bemerken, auf die EX stoßen könnte. Auf der anderen Seite möchte ich, dass Matlab andere Sachen macht, während EX läuft, z.B. Informationen zum Fortschritt anzeigen. Also muss der Anruf nicht blockierend sein.

Ich habe versucht, diesen offensichtlichen Konflikt zu umgehen, indem ich EX gestartet habe, wie im ersten Beispiel oben beschrieben. Um etwas anderen Code (Fortschrittsinformationen anzeigen) ausführen zu können, während EX beschäftigt ist, habe ich diesen Code in eine Funktion eingefügt und diese mit einem Timer mit einem kleinen StartDelay aufgerufen.

Leider bietet dies kein echtes Multithreading (etwas, das Matlab ohne die Parallel Computing Toolbox nicht zu schaffen scheint), d. h. wenn der Code im Timer-Callback länger als EX läuft, blockiert die Ausführung erneut, bis der Timer-Callback zurückkehrt. Noch schlimmer: Da ich nicht weiß, wie lange EX laufen wird, muss der Timer-Callback endlos laufen, bis er entweder gestoppt wird oder ein Flag übergibt, das ihm sagt, dass er aufhören soll. Ich habe versucht, mit globalen Variablen oder sogar dieses Flag in Anwendungsdaten wie folgt zu speichern:

%Vor%

Der Code, der auf den Aufruf von system () folgt, scheint nie ausgeführt zu werden und der Timer-Callback läuft für immer ... Gibt es einen anderen Weg, wie ich das zum Funktionieren bringen kann oder ist es wirklich entweder der Rückgabewert des Systems ODER der nicht blockierende Aufruf ?

    
Atze Kaputtnik 15.07.2011, 14:41
quelle

3 Antworten

8

Ich bin mir nicht sicher, ob MATLAB native / eingebaute Unterstützung für das Erstellen eines Prozesses bietet. Sie können jedoch Java von MATLAB verwenden, um es zu implementieren.

Zum Beispiel

%Vor%     
André Caron 15.07.2011, 17:15
quelle
2

Wenn Sie programmatischen Zugriff auf das andere Programm haben, dann ist der einfachste Weg, dies zu umgehen, einfach, dass das andere Programm Ergebnisse oder Fortschrittsnotizen in einer Textdatei speichert und Matlab das liest.

Wenn Sie es nicht auf diese Weise tun können, sollten Sie sich die Toolbox für die Parallelverarbeitung ansehen . Sie können einen Thread verwenden, um den Prozess zu starten, und einen anderen Thread, um ihn zu überwachen. Ich hatte wenige Fragen selbst zur Verwendung die Werkzeugkiste; Probiere ihre Beispiele aus und poste zukünftige Fragen hier. Viel Glück!

    
eykanal 15.07.2011 16:42
quelle
0

MATLAB kann Anrufe auf Systemebene tätigen. Anstatt $ für die "Parallel Computing Toolbox" auszugeben, rufen Sie Matlab von sich selbst an.

Mein Gerät hat 4 Kerne mit je 2 Threads. Wenn ich hart MATLAB arbeite, verwende ich nur 12,5% des Prozessors. So habe ich begonnen, mehr als eine Instanz von MATLAB gleichzeitig zu verwenden.

ex. (auf einer Windows-Maschine mit mehreren Kernen oder Hyper-Threading)

%Vor%

alles in einer Zeile an der MATLAB-Eingabeaufforderung, dies öffnet eine zweite Instanz, und beide zählen zu einer Milliarde.

Geben Sie MATLAB anstelle des for i=1:1000000000,disp(num2str(i));end; -Arguments einen Funktionsaufruf wie disp('dsfljkhjhkalkhjdfsahjkldahjkdfshjk') . Dies ermöglicht es Ihnen nicht, Rückgabevariablen leicht zu erhalten, aber eine gute Problemumgehung könnte sein, Dinge in .mat Dateien zu speichern.

    
Kyle 02.09.2011 17:33
quelle

Tags und Links