Signal
シグナルは、マルチプロセスアプリケーションにおいてプロセス間でのやり取りを管理し衝突を避けるために 4Dランゲージが提供するツールです。 シグナルは、1つ以上のプロセスが実行を一時停止し、特定のタスクが完了するまで待つようにする仕組みです。 どのプロセスもシグナルを待機またはリリースすることができます。
プロセス間のや り取りを管理するには、セマフォーも使用できます。 セマフォーは、2つ以上のプロセスが同じリソース (ファイル、レコードなど) を同時に変更しないようにするための仕組みです。 セマフォーを解除できるのは、それを設定したプロセスのみです。
Signal オブジェクト
シグナルは、ワーカーやプロセスを呼び出す/作成するコマンドに対して引数として渡す必要のある共有オブジェクトです。
4D.Signal
オブジェクトは次のビルトインされたメソッドおよびプロパティを持ちます:
シグナルの .wait()
メソッドを呼び出したワーカーやプロセスは、.signaled
プロパティが true になるまで実行を停止します。 シグナルを待っている間、呼び出したプロセスは CPU を消費しません。 これはマルチプロセスアプリケーションのパフォーマンスを鑑みると有意義な仕組みです。 .signaled
プロパティは、いずれかのワーカーまたはプロセスがシグナルの .trigger()
メソッドを呼び出した時点で true になります。
また、コードのブロックを避けるため、.wait()
呼び出しの際に定義したタイムアウト時間に達するこ とでも待機状態を脱することができます。
Signal objects are created with the New signal
command.
シグナルの使い方
In 4D, you create a new signal object by calling the New signal
command. 作成したシグナルは、New process
あるいは CALL WORKER
コマンドに引数として渡す必要があります。それにより、プロセスやワーカーはタスクを完了した際にシグナルを書き換えることができます。
signal.wait()
は、他のワーカー/プロセスのタスクが完了するまで待機するワーカー/プロセスから呼び出す必要があります。signal.trigger()
は、他のワーカー/プロセスを待機状態から解放するために、タスク実行を終えたワーカー/プロセスが呼び出す必要があります。
signal.trigger()
の呼び出しによって解放されたシグナルは 、再利用することができません。 別のシグナルを設定するには、New signal
コマンドをあらためて呼び出す必要があります。
Signal オブジェクトは 共有オブジェクト であるため、呼び出されたワーカー/プロセスから結果を返すために使用することもできます。 この場合、Use...End use
構文内で値を書き込む必要があります 。
例題
var $signal : 4D.Signal
// シグナルを作成します
$signal:=New signal
// メインプロセスを呼び出し、OpenForm メソッドを実行します
CALL WORKER(1;"OpenForm";$signal)
// 他の計算をします
...
// プロセスの終了を待機します
$signaled:=$signal.wait()
// 結果を処理します
$calc:=$signal.result+...
OpenForm メソッド:
#DECLARE ($signal : 4D.Signal)
var $form : Object
$form:=New object("value";0)
// フォームを開きます
$win:=Open form window("Information";Movable form dialog box)
DIALOG("Information";$form)
CLOSE WINDOW($win)
// $signal 共有オブジェクトに新しい属性を追加することで、他のプロセスに返り値を受け渡します:
Use($signal)
$signal.result:=$form.value
End use
// 待機プロセスに向けてシグナルをトリガーします
$signal.trigger()