プリエンプティブプロセスは、CPU の全コアを使用して大規模な計算を並列に実行する場合に非常に便利ですが、時にはタスクを協力なプロセス(例えば、ノンプリエンプティブコマンドを使用)に委譲する必要があります。この場合 New signalコマンドを使えば、あるプロセスを一時停止して、他のプロセスからの応答を待つことができます!
コマンドは New signalコマンドは、共有オブジェクトを作成し、現在のプロセスの中断と 継続を管理することができます。これには、2つのメソッドが用意されています。
- wait()
- トリガー()
以下の例では、プリエンプティブなプロセスからフォームを開く必要があります。コマンドはプリエンプティブではないので Open form windowコマンドはプリエンプティブではないので、フォームを開くためにメインプロセスが呼び出され、ユーザが値を入力するまで呼び出し側のプロセスは保留されます。
まず、メイン処理を呼び出して、結果を待つメソッドを書きます。
C_OBJECT
...// Waiting for the end of the process$signaled($signal)
// Creation of a signal
$signal :=New signal// call main process and execute OpenForm method
CALL WORKER (1; "OpenForm";$signal)
// do another calculation
:=$signal.wait()
// Calculate the results
$calc:=$signal...result+
…
そして、OpenForm メソッドでプロセスを起こし、trigger メソッドでプロセスを起こします。
C_OBJECT
$signal($1;$signal;$form)
$signal :=$1
$form :=New object("value";0)
// Open the form and ask the user for a value
$win :=Open form window("Information";Movable form dialog box)DIALOG("Information";$form)
CLOSE WINDOW ($win)
// Add a new attribute to $signal to pass result to other process
Use ($signal)
$signal .result:=$form.value
End use // Trigger the signal for the waiting process xml-ph-0034@deepl.inte
trigger()