New process
New process ( method ; stack {; name {; param {; param2 ; ... ; paramN}}}{; *} ) : Integer
引数 | 型 | 説明 | |
---|---|---|---|
method | Text | → | プロセスで実行させるメソッド |
stack | Integer | → | スタックサイズ (バイト) |
name | Text | → | 作成するプロセスの名前 |
param | Expression | → | メソッドに渡す引数 |
* | 演算子 | → | 重複しないプロセス |
戻り値 | Integer | ← | 新規に作成されたプロセス番号 または既存のプロセス番号 |
説明
New process コマンドは、(同じマシン上で) 新しいプロセスを開始し、そのプロセス参照番号を返します。
プロセスが作成できない場合 (例えば、メモリ不足) 、New processは0を返し、エラーが発生します。このエラーはON ERR CALLでインストールされたエラー処理メソッドを使用してとらえることができます。
プロセスメソッド
methodには、新しいプロセスのプロセスメソッド名を指定します。4Dは新規プロセスのコンテキストを設定した後、このメソッドの実行を開始します。したがって、これがプロセスメソッドになります。
実行コンテキストがプリエンプティブモードをサポートし、method 引数で指定したメソッドが"スレッドセーフ"であると宣言されていた場合、新規4D プロセスはアプリケーションがコンパイルモードで実行じにプリエンプティブスレッドで実行されます。詳細な情報については、プリエンプティブ4Dプロセス のページを参照してください。
プロセススタック
stack 引数を使用すると、プロセスのスタックのために割り当てられたメモリ量を指定することができます。この空間が、メソッド呼び出し、ローカル変数、サブルーチンの変数、スタックされたレコードを”積み上げる”ためのメモリーです。
- デフォルトのスタックサイズを使用するためにはstack に0を渡します。これはほとんどのアプリケーションに適しています(推奨設定)
- 一部の特定の場合において、カスタムの値を使用したい場合があるかもしれません。その際には値はバイト単位で指定しなければなりません。この設定は、プロセスチェーンの呼び出しやプラットフォームなどによるため、注意して使用する必要があります。
注: スタックはプロセスの合計メモリではありません。各プロセスはレコードやインタープロセス変数等のためにメモリを共有します。またプロセスはプロセス変数 の保持に追加のメモリを使用します。スタックには 4D の情報のさまざまな項目が格納されます。スタックに格納される情報の量は、ネストしたメソッドの呼び出し 数、前のフォームが閉じられる前に開かれたフォームの数、ネストしたメソッドで使用されるローカル変数のサイズに基づきます。
プロセス名
nameには新しいプロセスの名前を指定します。シングルユーザーモードでは、ここで指定した名前がランタイムエクスプローラーのプロセスリストに表示され、この新しいプロセスに対して Process info コマンドを実行するとこの名前が返されます。この引数は省略することができます。省略した場合、プロセス名は空の文字列になります。ローカルスコープのプロセスを作成するには、名前の先頭にドルサイン ($) をつけます。
重要: クライアント/サーバーにおいて、ローカルプロセスはデータにアクセスしてはいけないことに注意してください。詳細な情報については、グローバルプロセスとローカルプロセス の章を参照してください。
プロセスメソッドの引数
一つ以上のparam引数を使用して、プロセスメソッドに引数を渡す事ができます。サブルーチンにパラメータを渡すのと同じ要領でプロセスメソッドに引数を渡します(の章を参照して下さい)。プロセスメソッドは、新規プロセスのコンテキスト内で実行を開始する際に、$1、$2、等に引数の値を受け取ります。メソッドに対して配列を引数として受け渡すことができない点に留意してください。それに加え、New processコマンドのコンテキストでは以下の条件も考慮する必要があります:
- テーブルまたはフィールドへのポインターは渡す事ができます。
- 変数、特にローカル変数とプロセス変数へのポインターは、これらの引数がプロセスメソッドからアクセスされたときに定義されていない可能性があることから、推奨されていません。
- 標準のオブジェクトまたはコレクション型の引数は、コピーとして渡されます。つまり、4D は渡し先のプロセス内に、オブジェクトあるいはコレクションの参照を渡すのではなくコピーを作成します。オブジェクトまたはコレクション引数を参照として渡したい場合には、共有オブジェクトあるいは共有コレクションを使用する必要があります(共有オブジェクトと共有コレクション参照)。 注: プロセスメソッドに引数を渡す場合、必ずname引数を指定しなければなりません。この場合、この引数は省略できません。
オプションの * 引数
この最後の引数を指定した場合、4Dははじめにnameに指定した名前を持つプロセスが既に実行されているかどうかを調べます。同一名のプロセスが存在する場合、4Dは新規プロセスを開始せずにその名前を持つプロセスのプロセス番号を返します。
例題
以下のプロジェクトメソッドがある時:
// ADD CUSTOMERS
SET MENU BAR(1)
Repeat
ADD RECORD([Customers];*)
Until(OK=0)
メニューバーエディタでカスタムメニュー項目にこのプロジェクトメソッドを指定し、新規プロセス開始チェックボックスをチェックしている場合、4Dはそのメソッドを実行する新規プロセスを自動的に開始します。SET MENU BAR(1)を実行すると、この新規プロセスに対してメニューバーが追加されます。ウィンドウ (Open windowコマンドでオープンするウインドウ) が何も存在しない場合、ADD RECORDコマンドを実行することにより、自動的にウィンドウが開かれます。
カスタムのコントロールパネルのボタンをクリックすると、“Add Customers”プロセスが開始されるようにするには、以下のようにします:
// bAddCustomers button object method
$vlProcessID:=New process("Add Customers";0;"Adding Customers")
このボタンは、先に作ったメニュー項目と同じことを行います。
メニュー項目を選択したり、このボタンをクリックすると、プロセスを開始 (そのプロセスが存在しない場合) またはプロセスを前面に配置 (そのプロセスが既に実行中の場合) したい場合、以下のようにSTART ADD CUSTOMERSメソッドを作成することができます:
// START ADD CUSTOMERS
$vlProcessID:=New process("Add Customers";0;"Adding Customers";*)
If($vlProcessID#0)
BRING TO FRONT($vlProcessID)
End if
bAddCustomers のオブジェクトメソッドは以下のようになります:
// bAddCustomers button object method
START ADD CUSTOMERS
メニューバーエディタでADD CUSTOMERSメソッドをSTART ADD CUSTOMERSメソッドと置き換え、メニュー項目の新規プロセス開始チェックボックスを選択解除します。
参照
Execute on server
プリエンプティブ4Dプロセス
プロセス