2009-09-24 4 views
2

C++에서 호출 할 DLL에 MATLAB 프로젝트를 배포했는데 잘 작동합니다. 행복한 날들.C/C++에서 MATLAB m- 파일 함수를 중단하려면 어떻게합니까?

하지만 사용자가 작업 취소를 요청하면 어떻게됩니까?

UserAborted이라는 global 변수를 만들려고했습니다. MATLAB에서 long 함수를 실행하기 전에 0으로 초기화합니다. 내 긴 함수에서 루프의 각 반복에서 AbortIfUserRequested을 부르는

function AbortIfUserRequested 
    global UserAborted 

    if (UserAborted == 1) 
     error('User Abort'); 
    end 
end 

function UserAbortLongFunction 
    global UserAborted 

    UserAborted = 1; 
end 

: 나는 또한 다음과 같은 두 가지 기능을 썼다. 나는 또한 UserAbortLongFunction을 수출했다.

UserAbortLongFunction이 호출 된 직후에 long 함수가 AbortIfUserRequested에 도달하여 오류가 발생할 것으로 예상했습니다.

대신 긴 함수가 끝날 때까지 계속 실행, 만 다음UserAborted의 값은 바뀌지 않습니다.

사용자가 묻는대로 긴 기능을 중단하고 싶습니다. 그것을 할 방법이 있습니까?

+0

M 코드 인 경우 Matlab은 원근감있는 단일 스레드입니다. UserAbortLongFunction을 어떻게 호출합니까? 긴 작업이 아직 실행 중이거나 차단되어있는 동안 UserAbortLongFunction이 반환합니까? –

+0

'UserAbortLongFunction'에 대한 호출이 막히지 않으며, immidiatly를 반환합니다. M 코드 문제인지는 확실치 않습니다. 긴 함수가 실행되는 동안 MATLAB 내에서 명령 행에서'UserAbortLongFunction'을 실행하려고했습니다. 또한 긴 함수는'UserAborted'의 값을 코드의 많은 부분에서 작업의 일부로 인쇄했습니다. 오래 전부터'UserAbortLongFunction'라고 부른 긴 함수가 끝날 때까지 0을 유지했습니다. – scraimer

답변

1

Matlab은 실행 진행 상황을 보여주고 중단시킬 수있는 콜백 함수를 제공해야합니다. Google 검색은 Mathworks의 구현이 필요없는 많은 사람들을 보여줍니다.

+0

음 ... 좋은 지적입니다. 하지만 MATLAB은 표준 출력과 표준 오류를보고하기 위해 몇 가지 콜백 함수를 가지고 있습니다. 방금'disp ('PROGRESS = 33 %)'하고 표준 오류 처리를위한 콜백 함수를 호출했습니다.그런 다음 해당 문자열을 구문 분석하고 C++ GUI에서 진행 상황을 표시했습니다. 하지만 당신 말이 맞습니다. 적절한 지원이 없습니다. – scraimer

1

Matlab의 단일 스레드 특성으로 인해 첫 번째 함수가 실행되는 동안 전역 변수 값에 대한 업데이트가 전파되지 않을 수 있습니다. HashMap과 같은 Java 객체에 abort 플래그를 지정하여 간접 참조를 시도 할 수 있습니다. Java 객체는 참조로 전달되므로 Matlab 변수 자체를 변경하지 않고도 해당 상태에 대한 업데이트를 즉시 볼 수 있습니다.

이렇게하려면 미리보기가 있습니다. (미안 해요, 배포 된 DLL이를 테스트 할 매트랩 컴파일러 라이센스를 필요가 없습니다.)

function AbortIfUserRequested 
    global SharedState 
    if SharedState.get('UserAborted') 
     error('User Abort'); 
    end 
end 

function UserAbortLongFunction 
    global SharedState 
    SharedState.put('UserAborted', 1); 
end 

function InitUserAbort 
    global SharedState 
    SharedState = java.util.Collections.synchronizedMap(java.util.HashMap()); 
    SharedState.put('UserAborted', 0); 
end 

매트랩 응용 프로그램 데이터를 효과적으로 참조에 의해 전달된다. 전역 변수 대신 appdata에 중단 플래그를 넣는 것도 효과가있을 수 있습니다. 라이브러리가 Matlab GUI에서 작동하는 경우 전역 핸들 0 대신 그림 핸들에 응용 프로그램 데이터를 넣을 수 있습니다. 작동하는 경우 Java 객체보다 더 관용적 인 Matlab이됩니다.

function AbortIfUserRequested 
    if getappdata(0, 'UserAborted') 
     error('User Abort'); 
    end 
end 
function UserAbortLongFunction 
    setappdata(0, 'UserAborted', 1); 
end 
5

AbortIfUserRequested에서 DRAWNOW 함수를 호출 해보십시오. Matlab은 (API 관점에서) 단일 스레드이지만 인터럽트를 허용합니다. 나는 순수한 M 코드로이 함수를 호출함으로써 성공을 거두었지만, 사용자 입력 (Ctrl-C와 같은)은 그렇지 않으면 잠겼다.

관련 문제