6

MATLAB GUIを使用して、再生、一時停止、スライダーなどのボタンを備えたシンプルなリアルタイムデータビューアーを作成しています。ユーザーが再生スライダーを押した後、ステップごとに更新する必要があります(毎秒50サンプル)。その機能は、スライダーを手動で移動することを妨げています(スライダーを1/50秒で移動する必要があります)。今のところ、スライダーの更新を50回ごと(つまり1秒ごとに1回)に設定しました。スライダーを長く押したままにしない限り、更新にかかる時間は正常に機能します。

問題は、スライダープロパティの有効化がオンになっている場合、Buttondownfcnが左クリックでは機能しないことです(右クリックでは機能します)。Buttondownfcnを使用すると、更新をロックして問題を完全に解決できます。これを回避する方法はありますか?

% --- Executes on slider movement.
function slider_Callback(hObject, eventdata, handles)
disp('Slider movement')

% --- Executes on button down.
function slider_ButtonDownFcn(hObject, eventdata, handles)
disp('Button down')
4

1 に答える 1

1

再生ボタンを押したときにEnableスライダーのプロパティをoffまたはに設定し、再生を停止して に戻す関数を使用することで、割り込み再生を実現できます。inactiveButtonDownFcnEnableon

を再生ボタンとして使用しtogglebutton(他のコントロール ウィジェットは、アクセス可能な場所にブール値フラグを保存できる限り機能するはずです)、Callbackボタンとして次のように使用しました。

function playcallback(toggle_button, ~, slider_)
set(slider_, 'Enable', 'inactive'); %slider is disabled
while get(toggle_button, 'Value') %Value is used as flag for playing
    current_value = get(slider_, 'Value');
    set(slider_, 'Value', rem(current_value + 0.01, 1)); %shift slider (looping)
    pause(1/50);
end
set(slider_, 'Enable', 'on'); %done playing, turn slider back on
end

そして、ButtonDownFcnスライダーに関しては次のとおりです。

function stopslide(~, ~, toggle_button)
%play flag off: in playcallback, the while loop stops,
%the slider is enabled and the playcallback function returns
set(toggle_button, 'Value', 0); 
end

これらのコールバックは次のように登録できます。

set(toggle_button_handle, 'Callback', {@playcallback, slider_handle});
set(slider_handle, 'ButtonDownFcn', {@stopslide, toggle_button_handle});

警告: これと同様の方法でスライダー/再生ボタンと対話する他のウィジェットを追加し始めると、競合状態が発生する可能性が高くなります。

于 2012-04-24T16:27:10.610 に答える