共有オブジェクトおよび共有コレクションはプロセス間でコンテンツを共有することができる、特殊なオブジェクトとコレクションです。に比べると、共有オブジェクトと共有コレクションはプリエンプティブ4Dプロセスと互換性があるという点で利点があります。つまり、New process や CALL WORKERといったコマンドに、参照によって引数として渡すことができるということです。
ただし、共有オブジェクトあるいは共有コレクションを編集するコードは、必ずUse...End use キーワードでくくられている必要があり、そうでない場合にはエラーが返されます。
$s_obj:=New shared object("prop1";"alpha") Use($s_obj) $s_obj.prop1:="omega" End Use
共有オブジェクト/コレクションは一度に1プロセスずつしか編集することができません。Use は共有オブジェクト/コレクションを他のスレッドからアクセスできないようにロックする一方、End use は共有オブジェクト/コレクションのロックを解除します(ただしロッキングカウンターが0であれば。詳細は以下参照)。全てのオブジェクトとコレクションのロックを解除します。Use...End use が一つもない状態で共有オブジェクト/コレクションを編集しようとすると、エラーが生成されます。あるプロセスが、すでに他のプロセスによって使用されている共有オブジェクト/コレクションに対してUse...End use を呼び出した場合、その呼び出しはEnd use でロックが解除されるまで待機状態になります(エラーは生成されません)。結果として、Use...End use 構造内の編集は迅速に実行され、要素のロックは可及的速やかに解除される必要があります。そのため、共有オブジェクト/コレクションをインターフェース(ダイアログボックスなど)から直接編集することは避けることが強く推奨されます。
グループの共有オブジェクト/コレクションに対してUse を呼び出すと、同じグループに所属する全ての共有オブジェクト/コレクションのプロパティ/要素がロックされ、ロッキングカウンターが1増加されます。End use を呼び出すと、グループのロッキングがカウンターが1減少し、カウンターが0になると、リンクされている全ての共有オブジェクト/コレクションのロックが解除されます。
ARRAY TEXT($_items;0)
... //数える製品を配列に入れる $nbItems:=Size of array($_items) C_OBJECT($inventory) $inventory:=New shared object Use($inventory) $inventory.nbItems:=$nbItems End use
//プロセスを作成していく For($i;1;$nbItems) $ps:=New process("HowMany";0;"HowMany_"+$_items{$i};$_items{$i};$inventory) //$inventory オブジェクトを参照で渡す End for