タスクは newtask
または newtask4
を使用して、 指定された量のスタック領域(すべて同じ、 または、
データ・スタックとリターン・スタックと FP スタックとローカル変数スタックそれぞれのサイズを指定)で作成できます。
newtask
( stacksize – task ) gforth-experimental “newtask”
タスク(taskを作成します。 データ・スタックとリターン・スタックと FP
スタックとローカル変数スタックのサイズは全て同じにします(stacksize)(訳注: スタックごとに個別サイズ指定したい時は
newtask4
を使用してください)。
task
( ustacksize "name" – ) gforth-experimental “task”
タスク name を作成します。 各スタック(データ・スタック、 リターン・スタック、 FP スタック、 ローカル変数スタック) サイズは
ustacksize です。
実行時: ( – task )
newtask4
( u-data u-return u-fp u-locals – task ) gforth-experimental “newtask4”
データ・スタック・サイズ u-data、 リターン・スタック・サイズ u-return、 FP スタック・サイズ u-fp、 ローカル変数スタック・サイズ u-locals で task を作成します。
あなたが、 タスクにどのスタック・サイズを使用すればよいかわからない場合は、 メイン・タスクのサイズを流用できます:
stacksize
( – u ) gforth-experimental “stacksize”
u はメイン・タスクのデータ・スタックサイズです。
stacksize4
( – u-data u-return u-fp u-locals ) gforth-experimental “stacksize4”
メイン・タスクのデータ・スタック・サイズと、 リターン・スタック・サイズと、 FP スタック・サイズと、 ローカル変数スタックサイズを、 プッシュします。
タスクは非アクティブ状態(inactive state)で作成されます。 実行するには、 以下のいずれかのワードを使用してアクティブ化(activate)する必要があります:
initiate
( xt task – ) gforth-experimental “initiate”
task に xt を execute させます。 xt から戻ると、 タスクは自動的に終了します(VFX 互換)。 ワンタイム実行可能クロージャ(one-time executable closures)を使用して、 任意のパラメーターをタスクに渡せます。
以下の古い(legacy)ワード、 activate
と pass
は、 initiate
と同じ機能を提供しますが、 インターフェイスが異なります: does>
と同様に、 含まれるコロン定義が 2 つの部分に分割されます:
activate
/pass
より前の部分はタスクをアクティブ化する部分で実行され、
タスクをアクティブ化した後に呼び出し元に戻ります。 activate
/pass
より後の部分は、
アクティブ化されたターゲット・タスク内で実行されます。
activate
( run-time nest-sys1 task – ) gforth-experimental “activate”
指定のタスク(task)に activate
のより後ろにあるコードを実行させ、 activate
を含むワードの呼び出し元に戻ります。 タスクが activate
の後ろにあるコードから戻ると、 タスク自体が終了します。
pass
( x1 .. xn n task – ) gforth-experimental “pass”
現在のタスクのデータ・スタックから x1 .. xn n を取り出し、 x1 .. xn を task
のデータ・スタックにプッシュします。 task に pass
の後ろのコードを実行させ、 pass
を含むワードの呼び出し元に戻ります。 タスクが pass
の後ろにあるコードから戻ると、 タスク自体が終了します。
作成とアクティブ化(activation)をワン・ステップで行うこともできます:
execute-task
( xt – task ) gforth-experimental “execute-task”
メイン・タスクと同じスタック・サイズで新しいタスク task を作成します。 task に xt を execute させます。 xt から戻ると、 タスクは自動的に終了します。
タスクは最後まで実行して終了する以外に、 kill-task
を使用してタスク自身を終了することもできます。 他のタスクは
kill
で終了できます。
kill-task
( – ) gforth-experimental “kill-task”
現在のタスクを終了(terminate)します。
kill
( task – ) gforth-experimental “kill”
指定のタスク(task)を終了(terminate)します。
タスク自体を一時的に停止(temporarily stop)したり、 タスクを停止(be stopped)したりすることもできます:
halt
( task – ) gforth-experimental “halt”
タスクを停止(stop)する
stop
( – ) gforth-experimental “stop”
現在のタスクを停止(stop)し、 イベントを待ちます(再起動(restart)される可能性があります)
stop-ns
( timeout – ) gforth-experimental “stop-ns”
タイムアウト(ナノ秒単位)まで停止(stop)します。 ms
のより良い代替品です
タスクは、 タイムアウトが経過(timeout is over)するか、 別のタスクが以下のワードでウェイクアップ(wake)すると再起動(restart)します:
restart
( task – ) gforth-experimental “restart”
タスクを起動(wake)する
こちらもどうぞ:
pause
( – ) gforth-experimental “pause”
次の待機中のタスクに自発的に切り替えます(pause
は従来の協調(cooperative)タスク・スイッチャー(切替器)です。
pthread マルチタスクでは、 協調するのに pause
は必要ありませんが、 それでも使用できます。 例えば、
何らかの理由でポーリングに頼らなければならないときです)。 これにより、 キュー内のイベントもチェックされます。