1

グローバル変数を使用する関数があり、その値を別の関数から変更したい。いろいろ試してみましたが、値を使う関数がグローバル変数の新しい値で更新されていないようです。これが私が使用しているコードです。

計算.m

function calculateTest()

global isStop;
global value;

value=0;
while ~isStop
    pause(1);
    value = value+1
end

end

start.m

function start()

global isStop;
isStop = 0;
calculateTest();
end

stop.m

function stop()

global isStop;
isStop = 1;
end

start()を呼び出すと、値が出力され始めます。しかし、stop()を呼び出しても、停止することはありません。印刷を続けます。私が何を見逃しているのか分かりますか?

isStop == 0のときにも試しましたが、結果は同じでした。

4

2 に答える 2

2

必要なのは、matlab スクリプト/コマンド ラインから実行する可能性を残しながら実行するバックグラウンド スレッドだと思います。この機能は、純粋な意味で MATLAB によってサポートされていません。機能を使用して同様のことを実装できる場合があります。基本的に、MATLAB に一定の時間が経過した後に関数を繰り返し実行するように指示します。ただし、MATLAB はタイマー関数をフォアグラウンドで実行しています。実行中は、スクリプトを実行できません。そのため、タイマー関数に長いループを実装することはできません。MATLAB によって時々実行されるいくつかのタスクをスケジュールするのに適していますが、スレッド化は実装していません。calculateTeststoptimerstoptimer

MEX 関数を使用して独自のバックグラウンド スレッドを実装できます。その後、MEX 関数を呼び出して'start'/'stop'コマンドをスレッドに渡すことができます。しかし、MEX スレッドは内部でデータ処理を行う必要があります。たとえば、いくつかの matlab スクリプトを呼び出してジョブを実行することはできません。

別物。startおよびstopは、タイマーを管理する MATLAB 関数です。これらの識別子を独自の関数の名前として使用しないでください。これは許可されていますが、悪い習慣と見なされます。

于 2012-10-29T09:51:42.157 に答える
0

コード内のどこでも実際にstop関数を呼び出していないため、グローバル変数を更新する機会はありません。

たとえば、calculateTest()を変更するには、「」が5などの特定の数値に達したときに停止関数を呼び出す条件付きテストを追加します。

function calculateTest()

global isStop;
global value;

value=0;
while ~isStop
    pause(1);
    value = value+1
    if value == 5
        stop;
    end
end

end

あなたはこれがそれを完全にうまく止めることに気付くでしょう。代わりにstopコマンドをstartに追加した場合、CalculateTestの後で、制御フローがその行に到達しないため、これは機能しません。その関数が終了するまで、CalculateTestに残ります。

于 2012-10-29T04:28:59.203 に答える