查看单个帖子
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 如何在不链接的情况下从.NET使用命令行Matlab?

我终于找到了一种无需链接即可使用.NET命令行Matlab的方法:
  1. 使用David A. Zier的“ csmatio” dll将变量从.NET写入MAT文件。
  2. 从Matlab中读取文件,对其进行处理并将结果保存到MAT文件中:

    var process = new Process() { StartInfo = new ProcessStartInfo() { FileName = MatlabExecutableFileName, Arguments = "-nodisplay " + "-nojvm " + " -r \"somecommands; " + "save FILENAME OUTPUTVARIABLES; " + "exit;\"" } }; process.Start();
  3. 最糟糕的部分:等到过程完成。

    天真的方法:

    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); } 但是我担心最后一行代码。上面的代码块是为了避免这种情况而编写的,但是我不知道该怎么办。在某些计算机上,此时间量将太多,而在其他计算机上,该时间量将太少。


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();
回答:
更好的选择是matlab的-wait标志。它告诉matlab入门者在主matlab过程中终止。



更多&回答...
poster 当前离线   回复时引用此帖