2016-05-18 10 views
1

私のコードで無限ループを使用しています。ユーザーが特定のキーを押したときに制御をループから外していますか?

while 1 
% many statements/computation... 
... 
... 
end 

ユーザーが特定のキー(スペースバーなど)を押したときにループから抜け出すことができます。 hereのソリューションを試しましたが、運はありません。 Figureウィンドウは開きません。

なぜそのようなこと
+0

ループの実装方法を表示 – teivaz

+0

Ctrt + Cは通常動作しますが、現在実行中のコンパイル済み関数が終了するのを待機します。 –

+0

Ctrl + Cはアルゴリズムの実行を停止します。それは私が望むものではありません。私はちょうど私のコントロールがループから出てくるが、それはループの後に来るステートメントを実行する必要があります! –

答えて

2

どうぞ。

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 
  • EDIT

MatlabのGUIコンポーネント実際run on EDT thread、あなたはJavaのGUIオブジェクトを作成しない限り、メインの実行が起こっている1(に分離しています明示的にはjavaObjectEDTを使用せずに、これを避ける必要があります)。これは、クリックすると視覚的にボタンの状態を変えるなど、メイン実行スレッドとの同期を必要としない、いくつかのアクションに対してGUIコンポーネントが視覚的に反応できるようにするものですその上に。実際にコールバックを実行して実行スレッド内のワークスペースの状態を変更するには、Matlabに2つのスレッドを同期させる必要があります。これはpause/drawnowの助けとなります。実行中のスレッドで行っていた作業を中断し、その間にGUIコールバックを実行できるようにします。 drawnowは、元のコードブロックに実行を戻す前に保留中のキュー全体をクリアしますが、pauseは、時間がなくなるまでコールバックの一部を処理する可能性があります。 pause引数を1秒のほんの数分の一に設定して、すべての処理が行われるわけではありません。

異なるMatlabリリース間では、動作に若干の変化が見られます.2つのスレッドは、時間の経過とともにわずかに独立しているようです。驚くほど少ない正式な情報があります。そのほとんどは、thisthatのようなMatlabの中心部に散在している経験とさまざまな回答に基づいており、上にリンクされているようなUndocumentMatlabに関する素晴らしい記事です。

-2

:2つのルートを持っている

ended = false 
while !ended 
    if pressed_spacebar 
     ended = true 

あなたがループ条件を変更することができない場合は、ブレーク命令を使用することができますが、それは良いプログラミングの練習ではありません:)

+0

MATLABは 'pressed_spacebar'が何か知られているとは考えません。 –

+0

あなたは何かを使用できません: http://stackoverflow.com/questions/30659039/how-to-detect-keyboard-spacebar-press-in-matlab 'set(f、 'KeyPressFcn'、@ isspace); '? –

関連する問題