~~NOTOC~~ ---json { "title":"setapphandler()", "description":"アプリケーションハンドラにルーチンを設定します" } --- \\ ====== setapphandler() ======
==== 説明 ==== アプリケーションハンドラにルーチンを設定します。\\ ==== 構文 ==== setapphandler( func, node ) ==== 引数 ==== func : ルーチン node : 設定するノード番号 ==== 返り値 ==== ありません。\\ ==== 備考 ==== アプリケーションハンドラ(AppWork)はアプリケーション処理を行うためのハンドラでノードごとに1つ設定することができます。\\ サーバ処理イベント(_serve)に連動してアプリケーションハンドラが呼び出され、設定されたルーチンが呼び出されます。\\ ハンドラに設定したルーチンは新たなルーチンを設定するまで有効です。\\ ハンドラの呼び出しはイベントに連動しているため停止することができませんが、一時的に処理を停止するようなコードをルーチンに定義することで実現できます(用例を参考)。 ==== 用例 ==== キー入力に応じてアプリケーション処理を切り替える方法を説明します。\\ ※キー入力には[[.:io:input|入力制御モジュール(Input)]]を使用しています。\\ package App; # ●分岐処理(switch) sub switch { my $self = shift; my $me = $self->from(); my $in = $self->node( $me )->{'__Input'}; # 入力制御モジュールのオブジェクト $in->keyin(); # 入力制御モジュールの入力バッファに受信データを1文字入力 my $inkey = $in->inkey(); # 入力した文字を取得 # 1を入力したらApp::app1()を呼び出す if ($inkey eq '1') { $self->setapphandler( sub { $self->App::app_a() } ); } # 2を入力したらApp::app2()を呼び出す if ($inkey eq '2') { $self->setapphandler( sub { $self->App::app_b() } ); } # それ以外はハンドラに設定されているApp::switch()を再度呼び出す } # ●アプリケーション処理A(app_a) sub app_a { my $self = shift; $self->from_send("** app_a **\r\n"); $self->setapphandler( sub { $self->App::switch() } ); } # ●アプリケーション処理B(app_b) sub app_b { my $self = shift; $self->from_send("** app_b **\r\n"); $self->setapphandler( sub { $self->App::switch() } ); } このコードは、別のルーチンから $self->setapphandler( sub { $self->App::switch() } ); が設定され、アプリケーション処理ハンドラが(AppWork)呼び出された時点からのコードを示します。\\ 分岐処理(switch)ルーチンでは入力した文字を取得し、取得した文字が1ならルーチンapp_a()、2ならルーチンapp_b()をアプリケーション処理ハンドラ(AppWork)に設定します。 もし、入力が行われなかったり、1と2以外の文字を取得してもアプリケーション処理ハンドラ(AppWork)は設定されません。 ハンドラは前述、呼び出しを停止することができず、新たなルーチンを設定するまではイベントに連動して設定されているルーチンを呼び出します。\\ 従って、入力した文字が1または2のときは、それぞれのルーチンをハンドラに設定してルーチンを抜け、次にイベントが発生したときにはそれぞれのルーチンが呼び出されます。\\ もし、入力した文字が1または2以外、もしくは入力が行われなかった場合は、ハンドラの設定を行わずルーチンを抜けますので、次にイベントが発生したときは、その時点でハンドラに設定されている分岐処理ルーチン(switch)が呼び出されます。\\
~~DISCUSSION~~