2017-12-12 12 views
2

MathWorks社のMATLAB DLL関数が実行されている.NETのスレッドを停止する方法:きれいに私はこの関数で名前空間flagTestとクラス名のテストでMatlabのDLLをコンパイル

function [ ] = flagTest(flag) 
    while flag 
     disp(flag); 
     pause(1); 
    end 
end 

は、私はC#のようで、このDLL関数を呼び出すことができますこの:

using MathWorks.MATLAB.NET.Arrays; 
using MathWorks.MATLAB.NET.Utility; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //create test class object 
      flagTest.test T = new flagTest.test(); 
      MWLogicalArray flag = new MWLogicalArray(true); 
      //call matlab function flagTest 
      T.flagTest(flag); 
     } 
    } 
} 

私は私の名前空間と機能flagTestの両方を呼び出すので、それは混乱が生じた場合、私は申し訳ありません。私は今、何をしたいか

は(私が行う方法を知って)スレッド上でこのT.flagTest(flag)関数呼び出しを入れて、falseflagの値を変更するユーザーとしてスレッドを停止するUI上のボタンをクリックすることです。私たちのアプリケーションの実際のMATLAB関数では、関数スレッドを停止する前に、現在のファイルの読み込みを終了し、メモリ内のデータをディスクに書き込むなど、かなりの作業を行う必要があります。私は、MATLAB関数で何もせずにスレッドを停止することはできません。

.NETからMatlabへの参照によってオブジェクトを渡す方法を見つけられなかったので、この機能を実現するにはどうしたらいいのでしょうか。

答えて

0

ループを制御するフラグをtestクラスにカプセル化してみませんか?たとえば:

classdef test < handle 
    properties (Access = private) 
     Running 
    end 

    methods 
     function Start(this) 
      if (this.Running) 
       disp('Already Running'); 
       return; 
      end 

      this.Running = true; 
      disp('Started'); 

      while (this.Running) 
       pause(1); 
       disp('Running'); 
      end 

      disp('Stopped'); 
     end 

     function Stop(this) 
      this.Running = false; 
     end 
    end 
enn 

はその後、あなたのC#アセンブリ内:

namespace ConsoleApplication1 
{ 
    public static class Program 
    { 
     public static void Main(String[] args) 
     { 
      flagTest.test T = new flagTest.test(); 
      T.Start(); 

      while (true) 
      { 
       String command = Console.ReadLine(); 

       if (command.ToLowerInvariant() == "stop") 
       { 
        T.Stop(); 
        break; 
       } 
      } 
     } 
    } 
} 

これは言われて、このアプローチは、マルチスレッドとは何の関係もありません。スレッドが制御を持ってする方法を

  • キャンセル信号プロパティを実装する方法を
  • を殺されたときに進行あなたの労働者を保存する方法

    1. :あなたはマルチスレッドで動作するようにしたい場合は、次の3つの重要なことを考慮する必要がありますキャンセル信号

    上でこれは単なる一例であるが、それは改善されなければならない:

    CancellationTokenSource cts = new CancellationTokenSource(); 
    CancellationToken token = cts.Token; 
    
    List<Thread> threads = new List<Thread>(); 
    
    for (Int32 i = 0; i < 5; ++i) 
    { 
        flagTest.test T = new flagTest.test(); 
        token.Register(() => T.Stop()); 
    
        Thread thread = new Thread(() => T.Start()); 
        thread.IsBackground = true; 
    
        threads.Add(thread); 
    
        thread.Start(); 
    } 
    

    その後、ユーザーからキャンセルを求められた場合は、

    cts.Cancel(); 
    cts.Dispose(); 
    
  • +0

    Tommasoに電話してください。ありがとうございました!しかし、matlab deploytoolを使用してスタンドアロン関数のみをコンパイルできるように見えるので、このクラスを.NET dllにコンパイルする方法はわかりません。私は[this](https://stackoverflow.com/questions/15747411/how-to-compile-matlab-class-into-c-lib)を読んでいますが、100%はそれがどのように機能するのかまだ理解していませんリンクはC++コードで 'GlobalData'クラスを直接生成しないので、クラスを使用することはできず、クラス内の別のメソッドを呼び出すことはできません。 – dangwh

    +0

    私は別の方法を考えていました。すべてのループをMatlabの外に持ち込み、.NETアセンブリに組み込みます。そして、Matlab関数を書いて、できるだけDoWork(from、to)のような明確なオフセットを持つデータを処理できるようにします。この時点で、あなたは片面になるのであなたのスレッドを完全に制御することができます。 –

    +0

    はい。それは私が考えている別のオプションになりますし、私のチームメイトが一緒に行かないことに決めたMatlabコードをC#に書き直すことがたくさん必要です......私はMatlab関数をその関数をdllとしてコンパイルし、C#から呼び出します。しかし、私が直面している問題は、クラス内のflagプロパティを変更できるように、私はmatlabクラスをMWArrayオブジェクトに変換する方法を知らないということです。私はここで尋ねる別の質問でなければならないと思う。もう一度ありがとうございます。 – dangwh

    関連する問題