4D v16.3

On Exitデータベースメソッド

ホーム

 
4D v16.3
On Exitデータベースメソッド

On Exitデータベースメソッド 


 

On Exitデータベースメソッド  
このコマンドは引数を必要としません

  

On Exitデータベースメソッドは、データベースを終了すると一回呼び出されます。

このメソッドは、以下の4D環境で使用されます:

  • ローカルモードの4D
  • リモートモードの4D
  • コンパイルし、4D VolumeDesktopを組み込んだ4Dアプリケーション

Note: On Exitデータベースメソッドは、4D Serverでは起動されません。

On Exitデータベースメソッドは4Dによって自動的に起動されます。プロジェクトメソッドとは異なり、プログラムからデータベースメソッドを呼び出すことはできません。しかしメソッドエディタから実行することはできます。またサブルーチンを使用できます。

データベースは、以下のうちいずれかが発生すると終了します:

  • ユーザがデザインモードのファイルメニュー終了メニューを、またはアプリケーションモードで終了標準アクション付きのメニューやボタンを選択した場合
  • QUIT 4D コマンドへの呼び出しが実行された場合
  • 4DプラグインからQUIT 4D エントリポイントへの呼び出しが実行された場合

データベースの終了がどのような方法で行われたかに関わらず、4Dは以下のような処理を実行します:

  • On Exitデータベースメソッドがない場合、4Dは実行プロセスそれぞれを区別せずに1つずつアボートします。ユーザがデータ入力を実行している場合には、レコードはキャンセルされ、保存されません。
  • On Exitデータベースメソッドがある場合、4Dは新しく作成したローカルプロセスの中でこのメソッドの実行を開始します。したがって、このデータベースメソッドを使用し、インタープロセス間通信を通じて、(データ入力を)終了したり、処理の実行を中止したりしなければならないことを、他のプロセスに通知することができます。4Dは、いずれ終了するということに注意してください。On Exitデータベースメソッドは、必要なクリーンアップや終了の処理を実行することができますが、アプリケーションの終了を拒否できず、ある時点で終了することになります。

On Exitデータベースメソッドは、以下のような処理を実行するには最適です:

  • データベースを開いた時に自動的に開始されたプロセスを停止する。
  • 次回のセッションの始めにOn Startupデータベースメソッドで再利用するため、必要な環境設定や初期設定などの情報をローカルディスなどに保存する。
  • データベースを終了する度に実行したい処理が他にあれば、それを実行する。

注: On Exitデータベースメソッドがローカル/クライアントプロセスであり、データファイルにアクセスできないことを覚えておいてください。つまり、リモートモードで4Dを使用している時、On Exitデータベースメソッドで検索やソートを実行すると、4Dは "フリーズ" し、実際には終了しません。アプリケーションを終了するとき、リモートモードの4Dからデータにアクセスする必要があるならば、On Exitデータベースメソッド内から、新しいグローバルプロセスを作成してください。このグローバルプロセスはデータファイルにアクセスできます。この場合On Exitデータベースメソッドの終了前に、新しいプロセスが正しく終了されたことを (インタープロセス変数を使用するなどして) 確認してください。

注: クライアント/サーバー環境においては、ユーザーが手動で(終了メニューコマンドかQUIT 4D コマンドを呼び出すかで)終了するか、4D Server がシャットダウン(その結果全てのクライアントが強制終了)するかによって、振る舞いが異なります。
4D Server が終了してカットオフタイム(例:10分)の間待つ場合、接続された各クライアントには警告メッセージが表示され、もしユーザーが与えられた時間内に4Dを終了すれば、On Exitデータベースメソッド は通常どおり実行されます。しかしながら、他の場合(例えばユーザーが時間内に反応しなかった、サーバーが即時終了するようリクエストしてきた、クライアントが管理者によって手動で接続解除された、などの場合)、On Exitデータベースメソッド はサーバーへの接続が閉じられたのと同時に実行されます。結果として、On Exitデータベースメソッド は他のローカル、あるいはサーバープロセスをローンチさせることはできませんし、他のプロセスがキャンセルされるのを待つこともできません(またこれらのプロセスはサーバーに接続しつづけることもできません)。接続しようとした場合、ネットワークエラー(10001あるいは10002)が生成されます。サーバーへの接続はすでに閉じられているからです。

予期せぬシャットダウンの場合に適切にプロセスを終了するためには、1秒以上かかる可能性のある全てのループ(for、while、repeat)においてProcess aborted コマンドをテストする必要があります。Process aborted は4D(ローカル、リモート、4D Server)が終了しようとしている場合にはtrue を返し、これはつまり処理が間もなく即時終了しそうであるということを意味します。この場合、全ての処理を(CANCEL TRANSACTIONなどで)キャンセルし、可及的速やかに終了する必要があります。ユーザーが手動で終了する場合には時間がある場合がありますが、アプリケーションが強制的に終了する場合にはその時間はありません。

例題  

以下の例では、作業セッション中に発生する重要なイベントを追跡し、その説明を“Journal”という名前のテキストドキュメントに書き込むすべてのメソッドをカバーします。

 - On Startupデータベースメソッドは、インタープロセス変数vbQuit4Dを初期化します。この変数は、すべての使用プロセスに、データベースが終了中であるか通知するために使用されます。またこのメソッドは、ジャーナルファイルが存在しない場合にはそれを作成します。

  ` On Startup データベースメソッド
 C_TEXT(<>vtIPMessage)
 C_BOOLEAN(<>vbQuit4D)
 <>vbQuit4D:=False
 
 If(Test path name("Journal")#Is a document)
    $vhDocRef:=Create document("Journal")
    If(OK=1)
       CLOSE DOCUMENT($vhDocRef)
    End if
 End if
 WRITE JOURNAL("セッションが開始されました")

 - WRITE JOURNALプロジェクトメソッドは、他のメソッドからサブルーチンとして使用され、ジャーナルファイルに受け取った情報を書き込みます:

  ` WRITE JOURNAL プロジェクトメソッド
  ` WRITE JOURNAL ( Text )
  ` WRITE JOURNAL ( Event description )
 C_TEXT($1)
 C_TIME($vhDocRef)
 
 While(Semaphore("$Journal"))
    DELAY PROCESS(Current process;1)
 End while
 $vhDocRef:=Append document("Journal")
 If(OK=1)
    PROCESS PROPERTIES(Current process;$vsProcessName;$vlState;$vlElapsedTime;$vbVisible)
    SEND PACKET($vhDocRef;String(Current date)+Char(9)+String(Current time)+Char(9)
    +String(Current process)+Char(9)+$vsProcessName+Char(9)+$1+Char(13))
    CLOSE DOCUMENT($vhDocRef)
 End if
 CLEAR SEMAPHORE("$Journal")

ドキュメントが毎回開かれ閉じられることに注目してください。さらにドキュメントへのアクセス保護としてセマフォを利用していることにも注目してください。2つのプロセスがジャーナルファイルに同時にアクセスすることを防ぐためです。

 - M_ADD_RECORDSプロジェクトメソッドは、アプリケーションモードでレコード追加メニュー項目が選択されると実行されます:

  ` M_ADD_RECORDS プロジェクトメソッド
 MENU BAR(1)
 REPEAT
    ADD RECORD([Table1];*)
    If(OK=1)
       WRITE JOURNAL("Table1へのレコード追加 #"+String(Record number([Table1])))
    End if
 Until((OK=0)|<>vbQuit4D)

このメソッドは、ユーザが最後のデータ入力をキャンセルするか、またはデータベースを終了するまでループします。

 - [Table 1]の入力フォームには、On Outside Callイベントの処理手順も含まれています。したがって、プロセスがデータ入力中であっても、ユーザは現在のデータ入力を保存するかまたは保存しないで、スムーズに終了できます:

  ` [Table1];"Input" フォームメソッド
 Case of
    :(Form event=On Outside Call)
       If(<>vtIPMessage="QUIT")
          CONFIRM("このレコードに対する変更を保存しますか?")
          If(OK=1)
             ACCEPT
          Else
             CANCEL
          End if
       End if
 End case

 - M_QUITプロジェクトメソッドは、アプリケーションモードでファイルメニューから終了が選択されると実行されます:

  ` M_QUIT プロジェクトメソッド
 $vlProcessID:=New process("DO_QUIT";32*1024;"$DO_QUIT")

このメソッドには、ある仕掛けがあります。QUIT 4Dが呼び出されると、コマンドは即座に効果があります。したがって、呼び出しが発行されたプロセスは、データベースが実際に終了されるまでの間は“停止モード”になります。このプロセスは、データ入力が行われているプロセスの可能性があるため、QUIT 4Dの呼び出しは、この目的にだけ開始されるローカルプロセス内で実行されます。DO_QUITメソッドは、以下のようになります:

  ` DO_QUIT プロジェクトメソッド
 CONFIRM("本当に終了しますか?")
 If(OK=1)
    WRITE JOURNAL("データベース終了中")
    QUIT 4D
  ` QUIT 4Dは即座に効果があります。以下の行が実行されることはありません。
  ` ...
 End if

 - 最後に、すべての開いているユーザプロセスに対して“ただちに終了するよう”通知するOn Exitデータベースメソッドは、以下のようになります。このメソッドは、vbQuit4DTrueに設定し、データ入力を実行しているユーザプロセスに、プロセス間メッセージを送信します:

  ` On Exit データベースメソッド
 <>vbQuit4D:=True
 REPEAT
    $vbDone:=True
    For($vlProcess;1;Count tasks)
       PROCESS PROPERTIES($vlProcess;$vsProcessName;$vlState;$vlElapsedTime;$vbVisible)
       If(((($vsProcessName="ML_@")|($vsProcessName="M_@"))) & ($vlState>=0))
          $vbDone:=False
          <>vtIPMessage:="QUIT"
          BRING TO FRONT($vlProcess)
          CALL PROCESS($vlProcess)
          $vhStart:=Current time
          REPEAT
             DELAY PROCESS(Current process;60)
          Until((Process state($vlProcess)<0)|((Current time-$vhStart)>=?00:01:00?))
       End if
    End for
 Until($vbDone)
 WRITE JOURNAL("セッション終了中")

Note: "ML_..."または"M_..."で始まる名前を持つプロセスは、新規プロセス開始プロパティを選択したメニューによって開始されます。この例では、そのようなプロセスは、レコード追加メニューが選択された時に開始されたプロセスです。

(Current time-$vhStart)>=?00:01:00?という判定式により、データベースメソッドは“他のプロセスを待っている”状態を終了します。他のプロセスがただちに反応しない場合には、ループを繰り返します。

・次に示しているのは、データベースによって作成されたジャーナルファイルの代表的な例です:

2/6/0315:47:251Main processセッションが開始されました
2/6/0315:55:435ML_1Table1へのレコード追加 #23
2/6/0315:55:465ML_1Table1へのレコード追加 #24
2/6/0315:55:546$DO_QUITデータベース終了中
2/6/0315:55:587$xxセッション終了中

Note: $xxという名前は、On Exitデータベースメソッドを実行するために4Dが開始したローカルプロセスの名前です。



参照 

On Startupデータベースメソッド
QUIT 4D

 
プロパティ 

プロダクト: 4D
テーマ: データベースメソッド

 
履歴 

初出:

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v16)
ランゲージリファレンス ( 4D v16.1)
ランゲージリファレンス ( 4D v16.2)
ランゲージリファレンス ( 4D v16.3)