2009-07-12 2 views
1

私は最終的にリンクせずに、.NETからのコマンドラインMATLABを使用する方法を発見した:デイヴィッドA. Zierの「csmatio」DLLを使用してMATファイルへ.NETからリンクなしで.NETのコマンドラインMatlabを使用するには?

  1. 書き込み変数。

  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); 
    } 
    

    しかし、私は、コードの最後の行が心配です:

    現在作業コードが長くなっています。上のコードブロックはそれを避けるために書かれていましたが、私は何をすべきか分かりません。この時間は、一部のコンピュータではあまりにも多く、他のコンピュータでは少なすぎます。

SOLUTION私は完全に質問を(あなたは、本質的に、MATLABプロセスは、右完了したときに検出しようとしている?)を理解していますが、MATLABのメインを見つけることができなかった場合

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(); 

答えて

3

を働いていたので、私は少しソリューションを変更しました。それは、メインのMATLABプロセスと一緒に終了するようにmatlabのスターターに伝えます。

1

わかりませんアプリケーションプロセス&終了するのを待ちますか?すなわち、このような何か:

process.WaitForExit(); //only waits for the launcher process to finish 
//but now matlab should be running in a new process... 
var matlabProcess = Process.GetProcessesByName("whatever process is called"); 
//assuming only one matlab instance running... 
//you'd probably want to write some defensive code here... 
matlabProcess[0].WaitForExit(); 

それはときにその完成...

+0

パーフェクト!出来た! –

0

どのように別のスレッドのための実際のプロセスを決定し、WaitForExitを呼び出すことについて、それがファイルに&推測をウォッチ変更しようとするよりも簡単になりますように思えますそれ?コマンドラインプログラムtasklistを使用して、すべてのMATLABプロセスのPIDを取得し、使用しているPIDをフィルタリングすることができます。

また、processの子スレッドを返し、それを待つことができ(おそらくprocessに関連する).NET構造があるかもしれません。

残念ながら、私は詳細はわかりませんが、その道を探してみる価値はあります。

0

それははるかに良いオプションは、MATLABのため-waitのフラグである私のため

var previousProcesses = Process 
    .GetProcessesByName("Matlab") 
    .Select(a => a.Id) 
    .ToArray(); 
var process = Process.Start(startInfo); 
process.WaitForExit(); 
var newProcessRunning = Process 
    .GetProcessesByName("Matlab") 
    .Where(a => !previousProcesses.Contains(a.Id)); 
if (newProcessRunning.Count() != 0) 
    newProcessRunning.First().WaitForExit(); 
関連する問題