フォーム: 並行実行タスクの注意点

タスク特性の「並行実行」にチェックを入れて、並行実行タスクとして動作させる場合、いくつか注意しておくポイントがあります。
サンプルプログラムを使って、動作確認をしてみましょう。

<DBMSのセッション数>
並行実行タスクでは、DBMSのセッションは別々に管理されます。
そのため、トランザクションやロックは、それまでのタスクとは別扱いとなります。
つまり、既存タスクと並行実行タスクとで、同じレコードを修正しようとするとレコードロックが発生します。
使用時は、DBMSのセッション数に対する配慮が必要となります。

<メインプログラムの変数とメモリテーブル>
並行実行タスクでは、メインプログラムの変数は別々のメモリ管理下に置かれます。
別々の値を持つということです。
サンプルプログラムでは、実行時に「Ctrl+F1」を押すとグローバル変数を表示します。
MDIメニューの「グローバル変数の変更」を合わせて使うと理解できると思います。
また、メモリテーブルも別扱いとなります。共有できません。
共有が必要なワークファイル等は、Pervasive等を使います。

<コンテキスト>
並行実行タスクを使う場合は、「コンテキスト」という言葉の概念を理解しておきましょう。
色々なものが別扱いとなります。
そこで知っておきたいのがCtxで始まる関数です。
Ctxはコンテキストのことです。
サンプルプログラムでは、CtxGetNameとCtxSetNameを使っています。
オリジナルのMagic本体内で動作するタスク(並行実行でないもの)は、CtxGetNameの値が「Main」です。
並行実行タスクは起動時に、ユニークなコンテキスト名を持つのですが、CtxSetName関数を使うと開発者がコンテキスト名を指定することができます。
但し、その関数を使っても名前が重複する場合は、Magicが適当にユニーク名を付けます。
サンプルプログラムのSDIメニューから、「顧客マスタメンテ(基本)」を2回起動すると分かると思います。
そのようなエラーを防止するには「単一インスタンス」を使います。
SDIメニューの「顧客マスタメンテ(単一)」を2回起動してみましょう。
「顧客マスタメンテ(基本)」とは異なり、「顧客マスタメンテ(単一)」は常に1画面しか表示されません。

<メインプログラムのタスク後処理>
並行実行タスクでは、タスク特性の「メインプログラムの初期化」によって、メインプログラムのタスク前処理の制御が可能ですが、メインプログラムのタスク後処理は選択の余地がありません。
並行実行タスクが終了するとき、メインプログラムのタスク後処理は、必ず実行されます。
並行実行タスク終了時に処理させたくないメインプログラムのタスク後処理のコマンドは、「CtxGetName ()='Main'」を使って制御します。