2

C++ から呼び出されるように、MATLAB プロジェクトを DLL に展開しましたが、問題なく動作します。幸せな日々。

しかし、ユーザーが操作のキャンセルを要求した場合はどうなるでしょうか?

globalという名前の変数を作成してみましたUserAborted。MATLAB で long 関数を実行する前に、0 に初期化します。また、次の 2 つの関数も作成しました。

function AbortIfUserRequested
    global UserAborted

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

function UserAbortLongFunction
    global UserAborted

    UserAborted = 1;
end

AbortIfUserRequestedlong 関数のループの反復ごとに呼び出します。私も輸出しUserAbortLongFunctionました。

が呼び出された直後にUserAbortLongFunction、長い関数が の呼び出しに到達しAbortIfUserRequested、エラーがスローされると予想していました。

代わりに、long 関数は最後まで実行し続け、最後に get の値をUserAborted変更します。

私がしたいのは、ユーザーが私に求めたときにその長い機能を中止することだけです! それを行う方法はありますか?

4

3 に答える 3

5

AbortIfUserRequested で DRAWNOW 関数を呼び出してみてください。Matlab は (API の観点から) シングルスレッドですが、割り込みが可能です。ユーザー入力(Ctrl-Cなど)がロックアウトされる純粋なMコードでこの関数を呼び出すことで成功しました。

于 2009-09-25T00:27:02.297 に答える
1

Matlab は、実行の進行状況を表示し、場合によっては停止するコールバック関数を提供する必要があります。Google で検索すると、多くの人がこれを望んでいますが、Mathworks からの実装はありません。

于 2009-09-24T09:56:48.763 に答える
1

Matlab のシングル スレッドの性質により、最初の関数の実行中にグローバル変数の値の更新が伝播されない可能性があります。間接層として、HashMap などの Java オブジェクトに中止フラグを付けてみることができます。Java オブジェクトは参照によって渡されるため、Matlab 変数自体を変更しなくても、その状態の更新をすぐに確認できます。

そのためのスニペットを次に示します。(申し訳ありませんが、デプロイされた DLL でこれをテストするための Matlab コンパイラ ライセンスがありません。)

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

Matlab アプリのデータも実質的に参照によって渡されます。グローバル変数の代わりに appdata に中止フラグを入れることも機能する可能性があります。ライブラリが Matlab GUI で動作する場合、アプリケーション データをグローバル ハンドル 0 の代わりに Figure ハンドルに配置できます。これが動作する場合、Java オブジェクトよりも慣用的な Matlab になります。

function AbortIfUserRequested
   if getappdata(0, 'UserAborted')
      error('User Abort');
   end
end
function UserAbortLongFunction
   setappdata(0, 'UserAborted', 1);
end
于 2009-09-24T14:37:57.470 に答える