コールバックの実行
コールバック実行時の動作
リスナーでは、イベントの発生が通知されると、そのコールバック関数が実行されます。リスナーのコールバック実行時にエラーが発生しても、同じイベントに応答している他のリスナーやイベントをトリガーした関数が実行されないようにすることはできないという点で、リスナーは受動的なオブザーバーです。
コールバック関数の実行は、その関数が終了するまで続行されます。コールバック関数でエラーが発生した場合は、実行が停止され、制御は呼び出し側の関数に戻されます。その後、残りのリスナー コールバック関数が実行されます。
リスナーの実行順序
イベントの発生後にリスナー コールバック関数が実行される順序は、定義されていません。ただし、リスナー コールバックの実行は、イベントの発生と同期します。
ハンドル クラスの notify
メソッドは、notify
を呼び出した関数に実行を戻す前にすべてのリスナーを呼び出します。
notify
を呼び出すコールバック
notify
に渡し、その後リスナー コールバックに渡すイベント データ オブジェクトは、変更して再使用したり、コピーして再使用しないでください。
リスナー コールバックにより notify
を呼び出してイベントをトリガーすることができます。これにはコールバックを呼び出した同じイベントが含まれます。関数が notify
を呼び出すと、MATLAB® はコールバック関数に渡されるイベント データ オブジェクトのプロパティ値を設定します。続いて呼び出されるコールバックのプロパティが確実に適切値をもつようにするには、カスタム イベント データをもつ notify
を呼び出す場合には必ず新しいイベント データ オブジェクトを作成してください。
コールバック エラーの管理
エラーに対するプログラムの応答を制御する場合は、リスナー コールバック関数の try/catch
ステートメントを使用してエラー処理を行います。
関数ハンドルからの関数の呼び出し
クラス メソッド内で関数ハンドルを作成する場合、メソッドのコンテキストによって関数が実行されるコンテキストが決定されます。このコンテキストにより、そのクラスにアクセス可能なプライベートおよび保護されたメソッドへのアクセスが関数に付与されます。
たとえば、UpdateEvt
クラスは、Update
という名前のイベントおよびこのイベントのリスナーを定義します。リスナー コールバックはプライベート メソッド evtCb
です。
classdef UpdateEvt < handle events Update end methods function obj = UpdateEvt addlistener(obj,'Update',@evtCb); end end methods (Access = private) function obj = evtCb(obj,varargin) disp('Updated Event Triggered') end end end
プライベート メソッドは通常、クラス メソッドによってのみアクセス可能です。しかし、関数ハンドルがクラス メソッド内で作成されているので、notify
はクラスの外部からコールバックを実行できます。
a = UpdateEvt;
a.notify('Update')
Updated Event Triggered