1

編集:問題をよりよく理解し、最初のドラフトに不要な情報がたくさんあったため、質問を少し言い換えました。

ループ スクリプトを開始および停止できるトグル ボタンが必要なスタンドアロン MATLAB アプリケーションを作成しています。

この役立つビデオに基づいて、このアイデアを gui.m ファイルに次のように実装することができました。

function startBtn_Callback(hObject, eventdata, handles)

    if get(handles.startBtn,'Value')
        set(handles.startBtn,'String','Stop Recording');
    else
        set(handles.startBtn,'String','Start Recording');
    end

    while get(handles.startBtn,'Value');
        disp('looping..');
        pause(.5);
    end

このスクリプトは期待どおりに機能しますが、while ループの内容をループしたい関数に置き換えると、ボタンが機能しなくなります。ボタンを押すとまだトグルしますが、コールバックはボタンが最初に押されたときにのみ呼び出されます。最終的なコードは次のようになります。

function startBtn_Callback(hObject, eventdata, handles)

    if get(handles.startBtn,'Value')
        set(handles.startBtn,'String','Stop Recording');
        pause(.1);
    else
        set(handles.startBtn,'String','Start Recording');
        disp('Recording Stopped')
    end

    while get(handles.startBtn,'Value');
        myFunction();
    end

開始ボタンを押すと、このコールバックが実行され、ループが開始されます。テキストを変更するには、これpause(.1)が必要です。一時停止を含めないと、ループが開始されますが、ボタンのテキストは変更されません。

この後、ボタンを押しても何も起こりません。ボタンは GUI でトグルしますstartBtn_Callbackが、呼び出されることはなく、ループは無期限に実行されます。私のエンド ユーザーは MATLAB コンソールにアクセスできないため、これは問題です。

私の関数についてもう少し詳しく説明すると、5 秒間オーディオを録音し、何らかの処理を行ってから、いくつかのグラフを出力するメソッドです。ユーザーが停止を押すまで、このループを無期限に繰り返す必要があります。

myFunction()問題は、MATLAB が一度に 1 つの関数しか実行できないように見えるため、が実行されているときにコールバックを開始できないことだと思います。最初の例で機能した理由は、ループ呼び出しの間に一時停止があったためです。このプロジェクトの要件は、可能な限りすべての秒を記録することであるため、この一時停止はできません。

このプロセスの信頼できる停止ボタンを作成するにはどうすればよいですか?

MATLAB R2012b 32 ビットを実行しています。

4

2 に答える 2

2

コードスニペット内

a=get(handles.startBtn,'Value')
while a
    myFunction();
end

の値はa一度割り当てられ、その後変更されることはありません。したがって、while-loopは実行されないか、永久にループします。

while get(handles.startBtn,'Value')
    myFunction();
end

は反復ごとにボタンの値を照会しますが、特にmyFunction実行にそれほど時間がかからない場合は、GUIを遅くする可能性のあるJavaリクエストが多数あります。

これが、あなたが従った例がpause行を使用している理由であり、ループは約0.5秒ごとにのみ実行されます。

-行にクエリを含めたくない場合は、while代わりに次のように書くことができます。

%# read inital value of a
a=get(handles.startBtn,'Value');
while a
    myFunction();
    %# update a
    a=get(handles.startBtn,'Value');
end
于 2013-01-15T22:59:48.333 に答える
0

drawow() は私が探していた関数です。これを myFunction() の後に置くと、ループを続行する前に、Matlab が積み重ねられた GUI 呼び出しを処理するようになります。

このコードは、無期限かつ継続的なプロセスのための信頼できる開始/停止トグル ボタンを作成します。

function startBtn_Callback(hObject, eventdata, handles)

  if get(handles.startBtn,'Value')
      set(handles.startBtn,'String','Stop');
      drawnow();
  else
      set(handles.startBtn,'String','Start');
  end
  while get(handles.startBtn,'Value');
      myFunction();
      drawnow()
  end
于 2013-01-18T20:30:21.917 に答える