2017-12-12 19 views
2

매트랩의 DLL 함수를 실행하는 .NET 스레드를 중지하는 방법 :깨끗하게 나는이 기능을 네임 스페이스 flagTest 및 클래스 이름 테스트와 매트랩 DLL을 컴파일

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

나는 C#을 같은에서이 DLL 함수를 호출 할 수 있습니다 이 : 그것은 내가 내 네임 스페이스와 기능 flagTest 모두를 호출하기 때문에 혼란이 발생하는 경우

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

나는 죄송합니다.

는 내가 지금하고 싶은 스레드를 중지 UI의 버튼을 클릭 (내가하는 방법을 알고) 스레드에서이 T.flagTest(flag) 함수 호출을 넣어 사용자로 falseflag의 값을 변경하는 것입니다. 우리 응용 프로그램의 실제 matlab 함수에서 함수 스레드를 중지하기 전에 현재 파일을 읽는 것을 마치고 메모리에있는 데이터를 디스크에 쓰는 등의 작업을해야합니다. matlab 함수에서 아무 것도하지 않고 스레드를 멈출 수 없습니다.

.NET에서 Matlab에 대한 참조로 객체를 전달하는 방법을 알 수 없어이 기능을 구현할 수 있을지 궁금합니다.

답변

0

루프를 제어하는 ​​플래그를 test 클래스로 캡슐화하지 않는 이유는 무엇입니까? 예를 들면 : 당신의 C# 어셈블리 그런

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 

:

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. 제어를하는 방법
    2. 취소 신호

    위에 이것은 단지 예이지만 개선해야

    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 어셈블리에 넣으십시오. 그런 다음 가능한 경우 DoWork (from, to)와 같은 명확한 오프셋을 가진 데이터를 처리 할 수 ​​있도록 Matlab 함수를 작성하십시오. 이 시점에서 당신은 일방적 일 것이기 때문에 당신은 당신의 사물함을 완전히 통제 할 수있을 것입니다. –

    +0

    예. 그건 내가 생각했던 또 다른 옵션이 될거야 그리고 내 팀원들이 함께 가지 않기로 결정한 C#에 Matlab 코드를 다시 작성해야한다 ...... 나는 주위에 MATLAB 함수를 감쌀 수 있었다. matlab 클래스를 컴파일하고 해당 함수를 dll로 컴파일하고 C#에서 호출합니다.그러나, 내가 직면 한 문제는 클래스 내부의 플래그 속성을 변경할 수 있도록 matlab 클래스를 MWArray 객체로 변환하는 방법을 모른다는 것입니다. 나는 그것이 내가 여기에서 묻는 또 다른 질문이어야 할 것이다라고 생각한다. 다시 한번 감사드립니다. – dangwh