私のコードで無限ループを使用しています。ユーザーが特定のキーを押したときに制御をループから外していますか?
while 1
% many statements/computation...
...
...
end
ユーザーが特定のキー(スペースバーなど)を押したときにループから抜け出すことができます。 hereのソリューションを試しましたが、運はありません。 Figureウィンドウは開きません。
なぜそのようなこと私のコードで無限ループを使用しています。ユーザーが特定のキーを押したときに制御をループから外していますか?
while 1
% many statements/computation...
...
...
end
ユーザーが特定のキー(スペースバーなど)を押したときにループから抜け出すことができます。 hereのソリューションを試しましたが、運はありません。 Figureウィンドウは開きません。
なぜそのようなことどうぞ。
1)現在の図形のコールバックを偶数行にして、KeyPressFcn
コールバックを登録することができます。 catchはMatlabがシングルスレッド*なので、ループがいくつかのコードを連続して実行する限り、イベントは処理されません。回避策はループ内にdrawnow
またはpause
文を挿入することです。これにより、メインスレッドの実行が停止し、キープレスなどの外部イベントが処理されます。コールバックでは、いくつかのフラグの状態を変更する必要があります。いくつかのグラフィックスハンドルのオブジェクトプロパティ/ appdata、またはグローバル変数(これについては私がお勧めします)があります。ループ内からクエリを実行し、フラグが変化していることを確認することができます。
function test()
hFig = figure();
setappdata(hFig, 'space_pressed', false);
set(hFig, 'KeyPressFcn', @keyPressedFcn);
while true
A = randn(10000); % doing some stuff
pause(0.01);
flag = getappdata(hFig, 'space_pressed');
if flag
break;
end
fprintf('Still running...\n');
end
fprintf('Finished!\n');
end
function keyPressedFcn(hFig, event)
fprintf('Pressed character: "%s"...\n', event.Character);
if strcmp(event.Character, ' ')
setappdata(hFig, 'space_pressed', true);
end
end
出力例:
>> test
Still running...
Still running...
Pressed character: "h"...
Still running...
Still running...
Pressed character: " "...
Finished!
2)第2のアプローチは、CurrentCharacter
をポーリングすることであろう。文字ストロークを処理するには、pause
/drawnow
を使用して実行を停止する必要があります。このアプローチの副作用は、キーを押すとフォーカスがコマンドウィンドウに移動し、キャラクタもそこに表示されることです。 MATLABでのスレッド上で起草
function test()
hFig = figure();
set(hFig, 'CurrentCharacter', '^'); % some other character
drawnow();
while true
A = randn(10000); % doing some stuff
pause(0.01);
char = get(hFig, 'CurrentCharacter');
if strcmp(char, ' ')
break;
end
fprintf('Still running...\n');
end
fprintf('Finished!\n');
end
MatlabのGUIコンポーネント実際run on EDT thread、あなたはJavaのGUIオブジェクトを作成しない限り、メインの実行が起こっている1(に分離しています明示的にはjavaObjectEDT
を使用せずに、これを避ける必要があります)。これは、クリックすると視覚的にボタンの状態を変えるなど、メイン実行スレッドとの同期を必要としない、いくつかのアクションに対してGUIコンポーネントが視覚的に反応できるようにするものですその上に。実際にコールバックを実行して実行スレッド内のワークスペースの状態を変更するには、Matlabに2つのスレッドを同期させる必要があります。これはpause
/drawnow
の助けとなります。実行中のスレッドで行っていた作業を中断し、その間にGUIコールバックを実行できるようにします。 drawnow
は、元のコードブロックに実行を戻す前に保留中のキュー全体をクリアしますが、pause
は、時間がなくなるまでコールバックの一部を処理する可能性があります。 pause
引数を1秒のほんの数分の一に設定して、すべての処理が行われるわけではありません。
異なるMatlabリリース間では、動作に若干の変化が見られます.2つのスレッドは、時間の経過とともにわずかに独立しているようです。驚くほど少ない正式な情報があります。そのほとんどは、thisとthatのようなMatlabの中心部に散在している経験とさまざまな回答に基づいており、上にリンクされているようなUndocumentMatlabに関する素晴らしい記事です。
:2つのルートを持っている
ended = false
while !ended
if pressed_spacebar
ended = true
あなたがループ条件を変更することができない場合は、ブレーク命令を使用することができますが、それは良いプログラミングの練習ではありません:)
MATLABは 'pressed_spacebar'が何か知られているとは考えません。 –
あなたは何かを使用できません: http://stackoverflow.com/questions/30659039/how-to-detect-keyboard-spacebar-press-in-matlab 'set(f、 'KeyPressFcn'、@ isspace); '? –
ループの実装方法を表示 – teivaz
Ctrt + Cは通常動作しますが、現在実行中のコンパイル済み関数が終了するのを待機します。 –
Ctrl + Cはアルゴリズムの実行を停止します。それは私が望むものではありません。私はちょうど私のコントロールがループから出てくるが、それはループの後に来るステートメントを実行する必要があります! –