ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

コールバック実行の中断

MATLAB® では、コールバック関数の実行中に割り込み可能かどうかを制御できます。たとえば、アニメーションに割り込むコールバックを作成することで、ユーザーはアニメーションのループを停止することができます。一方で、実行するコールバックの順序が重要な場合は、割り込みできないようにする必要があります。たとえば、イメージのさまざまなセクションを表示する WindowButtonMotionFcn コールバックでは、割り込みを許可しないようにできます。

割り込みを制御する方法

コールバック関数は、キュー内での順序に従って実行されます。あるコールバックを実行中にユーザーのアクションが別のコールバックをトリガーすると、2 番目のコールバックは最初のコールバックに割り込もうとします。最初のコールバックは、"実行中コールバック" です。2 番目のコールバックは、"割り込みコールバック" です。

2 つのプロパティ値により、割り込みの試行に対する対応を制御します。

  • 実行中のコールバックを所有するオブジェクトの Interruptible プロパティが、割り込み可能かどうかを決定します。値 'on' は、割り込みを許可します。値 'off' は、割り込みを許可しません。既定値は 'on' です。

  • 割り込みが許可されない場合は、割り込みコールバックを所有するオブジェクトの BusyAction プロパティが、そのコールバックを破棄するかキューに入れるかを決定します。値 'queue' は、実行中コールバックの実行が終了した後に割り込みコールバックの実行を許可します。値 'cancel' は、割り込みコールバックを破棄します。既定値は 'queue' です。

割り込み可能な場合のコールバックの動作

オブジェクトの Interruptible プロパティが 'on' に設定されている場合、そのコールバックは、drawnowfiguregetframewaitforpausewaitbar のいずれかのコマンドが次に発生したときに割り込み可能です。

  • 実行中コールバックにこのいずれかのコマンドが含まれている場合、MATLAB は実行中コールバックの実行を停止し、割り込みコールバックを実行します。割り込みコールバックが完了したときに MATLAB は実行中だったコールバックの実行を再開します。

  • 実行中のコールバックにこれらのコマンドが含まれていない場合、MATLAB はそのコールバックの実行を中断せずに終了させます。

割り込みのプロパティとその影響の詳細については、UIControl のプロパティ ページに記載されている Interruptible プロパティを参照してください。

この例では、Interruptible プロパティと BusyAction プロパティ、およびウェイト バーを使用して、コールバックの割り込みを制御する方法を説明します。

ソース ファイルのコピー

  1. MATLAB で、現在のフォルダーを書き込みアクセス権限のあるフォルダーに設定します。

  2. 以下の MATLAB コマンドを実行します。
    copyfile(fullfile(docroot, 'techdoc','creating_guis','examples',...
    'callback_interrupt.m')),fileattrib('callback_interrupt.m', '+w');

コード例の実行

コマンド callback_interrupt を実行します。このプログラムにより、2 つのウィンドウが表示されます。

特定のボタンのペアをクリックして、さまざまなプロパティ値の組み合わせの影響を示します。

  • コールバックの割り込み — [Wait (interruptible)] をクリックした直後に 2 番目のウィンドウで次のいずれかのボタンをクリックします。[Surf Plot (queue)] または [Mesh Plot (cancel)]。ウェイト バーが表示されますが、直ちにプロット操作に割り込まれます。

  • コールバックのキューイング — [Wait (uninterruptible)] をクリックした直後に [Surf Plot (queue)] をクリックします。ウェイト バーが最後まで実行されます。その後、表面プロットが表示されます。

  • コールバックのキャンセル — [Wait (uninterruptible)] をクリックした直後に [Mesh Plot (cancel)] をクリックします。ウェイト バーが最後まで実行されます。MATLAB はメッシュ プロットのコールバックを破棄するため、プロットは表示されません。

ソース コードの検証

それぞれのボタンを作成する際に、関数 uicontrol への入力引数として Interruptible プロパティおよび BusyAction プロパティを渡します。

[Wait (interruptible)] プッシュ ボタンを作成するコマンドは、以下のとおりです。Interruptible プロパティは、'on' に設定されています。

h_interrupt = uicontrol(h_panel1,'Style','pushbutton',...
                        'Position',[30,110,120,30],...
                        'String','Wait (interruptible)',...
                        'Tooltip','Interruptible = on',...
                        'Interruptible','on',...
                        'Callback',@wait_interruptible);

[Wait (uninterruptible)] プッシュ ボタンを作成するコマンドは、以下のとおりです。Interruptible プロパティは、'off' に設定されています。

h_nointerrupt = uicontrol(h_panel1,'Style','pushbutton',...
                        'Position',[30,40,120,30],...
                        'String','Wait (uninterruptible)',...
                        'Tooltip','Interruptible = off',...
                        'Interruptible','off',...
                        'Callback',@wait_uninterruptible);

[Surf Plot (queue)] プッシュ ボタンを作成するコマンドは、以下のとおりです。BusyAction プロパティは、'queue' に設定されています。

hsurf_queue = uicontrol(h_panel2,'Style','pushbutton',...
                        'Position',[30,200,110,30],...
                        'String','Surf Plot (queue)',...
                        'BusyAction','queue',...
                        'Tooltip','BusyAction = queue',...
                        'Callback',@surf_queue);

[Mesh Plot (cancel)] プッシュ ボタンを作成するコマンドは、以下のとおりです。BusyAction プロパティは、'cancel' に設定されています。

hmesh_cancel = uicontrol(h_panel2,'Style','pushbutton',...
                        'Position',[30,130,110,30],...
                        'String','Mesh Plot (cancel)',...
                        'BusyAction','cancel',...
                        'Tooltip','BusyAction = cancel',...
                        'Callback',@mesh_cancel);

参考

| | |

関連するトピック