我終於發現了一種從.NET中使用命令行Matlab的無連接:從.NET如何使用命令行從.NET的Matlab沒有鏈接?
寫變量使用大衛A.紫兒的「csmatio」一個DLL文件MAT。
閱讀從MATLAB,並處理該文件,並將結果保存到一個文件MAT:
var process = new Process() { StartInfo = new ProcessStartInfo() { FileName = MatlabExecutableFileName, Arguments = "-nodisplay " + "-nojvm " + " -r \"somecommands; " + "save FILENAME OUTPUTVARIABLES; " + "exit;\"" } }; process.Start();
最糟糕的部分:等到過程結束。
簡易方法:
process.WaitForExit();
不起作用,因爲MATLAB在一個新的線程
留意更改輸出文件產卵的主要應用是棘手:
new FileSystemWatcher(MatlabPath, fileName) .WaitForChanged(WatcherChangeTypes.All)
由於這個班級的錯誤而無法工作。
當前工作的代碼較長:
using (var watcher = new FileSystemWatcher(MatlabPath, fileName)) { var wait = new EventWaitHandle(false, EventResetMode.AutoReset); watcher.EnableRaisingEvents = true; watcher.Changed += delegate(object sender, FileSystemEventArgs e) { wait.Set(); }; foreach(var i in Enumerable.Range(0, 2)) { if (!wait.WaitOne(MillissecondsTimeout)) { throw new TimeoutException(); } } Thread.Sleep(1000); }
但我關心的代碼的最後一行。上面的代碼塊是爲了避免它而編寫的,但我不知道還有什麼要做。這段時間在某些計算機上太多而在其他計算機上太少。
SOLUTION
var previousProcesses = Process
.GetProcessesByName("Matlab")
.Select(a => a.Id)
.ToArray();
process.Start();
process.WaitForExit();
var currentProcess = Process
.GetProcessesByName("Matlab")
.Where(a => !previousProcesses.Contains(a.Id))
.First();
currentProcess.WaitForExit();
完美!有效! – 2009-07-23 23:34:00