2012-05-08 14 views
0

コールバック関数と "drawnow"とともに使用されるswitch-caseステートメントのwhileループに問題があります。私のコードでは、switch-caseのケースはuicontrolのpushbuttonsによって決まりますが、case文には、 'windowbuttondown/up/motionfcn's'を使ってマウスの動きを追跡するコールバック関数が追加されています。しかし、case文のwhileループ内に複数のプロットを描画するので、プログラムを実行すると次のエラーが表示されます。using drawnow:uicontrolコールバックを評価中の割り込み

エラー1608 ==> drawnow ??? uicontrolコールバックの評価中に割り込みが発生する

caseステートメント内のコードは、独立して実行するとエラーは発生しませんが、以下に添付するコードの残りの部分と統合されると問題が発生します。どんな援助も非常に高く評価されます。どうもありがとう!

function programme(selection) 

if nargin == 0 
selection=0 
end 

switch selection 
case 0 %start GUI and uicontrols to set up the cases i.e programme(1), programme(2) etc   
    uicontrol('style','pushbutton',... 
     'string','First', ... 
     'position',[50 700 50 20], ... 
     'callback','programme(1);'); 
    uicontrol('style','pushbutton',... 
     'string','Second', ... 
     'position',[150 700 50 20], ... 
     'callback','programme(2);'); 

case 1 

    %mouse track: 
    set(gcf,'windowbuttondownfcn','mousedown=1;'); 
    set(gcf,'windowbuttonupfcn','mouseup=1;'); 
    set(gcf,'windowbuttonmotionfcn','mousemotion=1;'); 

    %to terminate the while loop, set up stopit=1 on one of uicontrol buttons: 
    uicontrol('style','pushbutton',... 
     'string','First', ... 
     'position',[50 700 50 20], ... 
     'callback','stopit=1;'); 

    stopit=0; 

    while (stopit==0) 
     if mousedown==1 
      statements 
      if mouseup ==1 
       statements (plots) 
       mouseup=0; 
       mousedown=0; 
       mousedown=0; 
      end 
     end 
     drawnow 
    end 

case 2 
    statements 
otherwise 
    statements 

ヘルプの終わり

答えて

1

ルック:drawnow それはコールバックを中断します。そしてあなたはコールバックであなたの関数を呼び出します。たぶんpause(0.01)に置き換えることができます。

ループを取り除き、代わりにコールバックを使用することを強くお勧めしますが、

+0

こんにちは、ありがとうコメントのためにたくさん!残念ながら、pause(0.01)も非常に同じエラーを返します。私はwhileループを取り除く方法を見つけようとしてきましたが、それから私は正確にはわかりません。上記のコードでは、GUIユーザは、停止ボタンを押すまで対話的にプロット上の線を曲げることができます。大文字と小文字のオプションは、プロット上の異なる領域を選択します。私は2つのネストされたswitch-case引数(リージョン選択のためのもの、マウストラックのためのもう1つ)が効率的かつ適用可能であるとは思わない。さらなるアドバイスをお願いしますか?私はdrawnowを使用して各反復でFigureを更新する必要があります。 – user1365673

+0

実際にあなたは引っ越しを必要としません。 Matlabは時間を見つけたら再描画します。 drawnowは、すべての背景のものを中断し、 "今すぐに描画する"ように指示します。残念ながら、あなたのコールバック関数はバックグラウンドの一つです。あなたの問題は、whileループが描画をブロックし、drawnowがループを壊すことです。あなたはあなたのプログラムを異なるものにする必要があります。 – bdecaf

関連する問題