ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com |
|||||||||||||||||||||||||||||||||||||||||||||||
|
4D v20 R7
On Exitデータベースメソッド
|
On Exitデータベースメソッド | ||||||||
このコマンドは引数を必要としません | ||||||||
On Exitデータベースメソッドは、データベースを終了すると一回呼び出されます。
このメソッドは、以下の4D環境で使用されます:
Note: On Exitデータベースメソッドは、4D Serverでは起動されません。 このコンテキストにおいてはOn Server Shutdownデータベースメソッド を使用してください。
On Exitデータベースメソッドは4Dによって自動的に起動されます。プロジェクトメソッドとは異なり、プログラムからデータベースメソッドを呼び出すことはできません。しかしメソッドエディタから実行することはできます。またサブルーチンを使用できます。
データベースは、以下のうちいずれかが発生すると終了します:
データベースの終了がどのような方法で行われたかに関わらず、4Dは以下のような処理を実行します:
4D が終了しようとしているとき、プログラムは内部的に以下のようなことをします:
4D は生きているプロセスがある限り、プロセスをループし続けます。これは最大13秒間続きます。終了アクションに対応するためには、On Exitデータベースメソッド またはカスタムの終了メソッド内において(例えばStorage オブジェクトへのエントリーなど)フラグを設定することが推奨されます。実行中のプロセスが終了アクションに対応し、プロセス自身を適切に終了させる時間を稼ぐためには、このメソッド内において(最大10秒間の)ループを行うのが理にかなっていると言えます。10秒以上待つことは推奨されておらず、この場合には4D はプロセスを強制終了させるか、あるいはOS がアプリケーション全体を強制終了させます。
On Exitデータベースメソッドは、以下のような処理を実行するには最適です:
注: On Exitデータベースメソッドがローカル/クライアントプロセスであり、データファイルにアクセスできないことを覚えておいてください。つまり、リモートモードで4Dを使用している時、On Exitデータベースメソッドで検索やソートを実行すると、4Dは "フリーズ" し、実際には終了しません。アプリケーションを終了するとき、リモートモードの4Dからデータにアクセスする必要があるならば、On Exitデータベースメソッド内から、新しいグローバルプロセスを作成してください。このグローバルプロセスはデータファイルにアクセスできます。この場合On Exitデータベースメソッドの終了前に、新しいプロセスが正しく終了されたことを (Storage を使用するなどして) 確認してください。
注: クライアント/サーバー環境においては、ユーザーが手動で(終了メニューコマンドかQUIT 4D コマンドを呼び出すかで)終了するか、4D Server がシャットダウン(その結果全てのクライアントが強制終了)するかによって、振る舞いが異なります。
4D Server が終了してカットオフタイム(例:10分)の間待つ場合、接続された各クライアントには警告メッセージが表示され、もしユーザーが与えられた時間内に4Dを終了すれば、On Exitデータベースメソッド は通常どおり実行されます。しかしながら、他の場合(例えばユーザーが時間内に反応しなかった、サーバーが即時終了するようリクエストしてきた、クライアントが管理者によって手動で接続解除された、などの場合)、On Exitデータベースメソッド はサーバーへの接続が閉じられたのと同時に実行されます。結果として、On Exitデータベースメソッド は他のローカル、あるいはサーバープロセスをローンチさせることはできませんし、他のプロセスがキャンセルされるのを待つこともできません(またこれらのプロセスはサーバーに接続しつづけることもできません)。接続しようとした場合、ネットワークエラー(10001あるいは10002)が生成されます。サーバーへの接続はすでに閉じられているからです。
以下の例は、On Startupデータベースメソッド (あるいはOn Server Startupデータベースメソッド) 内において、無限に実行し続ける1つまたは複数のバックグラウンドプロセスを立ち上げるような場合の典型例を考えます。アプリケーション内のStorage オブジェクト内にあるフラグを使用して、これらのプロセスに終了することを伝えると同時に、きちんと終了したかどうかをチェックするようになっています。
Use(Storage)
Storage.global:=New shared object("ExitNow";False)
End use
$p:=New process("Serverjob";0;"Background job#1")
$p1:=New process("Check_Invoices";0;"Background job#2")
// サーバー上で通常のバックグラウンドジョブを行う
While(Not(Bool(Storage.global.ExitNow)))
// 会計処理、データ計算などを行う
// ...
DELAY PROCESS(Current process;60*60) // 1分間プロセスをスリープさせ、ループを繰り返す
End while
Use(Storage.global)
Storage.global.ExitNow:=True // 全てのバックグラウンドワーカーに終了するよう伝える
End use
$time:=Current time
$finished:=False
While((($time+10)>(Current time+0))&(Not($finished))) // 上限 10 秒
$list:=Get process activity(Processes only) // 全てのプロセスの一覧を取得
$sublist:=$list.processes.query("name='Background job@' and state >=0") // まだ実行中のバックグラウンド処理があるかチェック
$finished:=($sublist.length=0)
If($sublist.length>0)
For each($job;$sublist)
RESUME PROCESS($job.number) // 全てのプロセスが起きているようにする
End for each
End if
End while
プロダクト: 4D
テーマ: データベースメソッド
番号:
905252
初出:
ランゲージリファレンス ( 4D v20 R7)