コルーチン(coroutine、co は協調の意)

コルーチンはスレッドに似た機能を実現します。 コルーチンはいったん処理を中断したあとで、その続きから処理を再開することができるので、 複数のコルーチンが中断/再開の協調動作をすることでマルチスレッドを実現します。
下記の例では、2つのコルーチンを使用しています。 コルーチンを使用する場合は、タイマハンドラや受信ハンドラから呼出すようにして 必ず Stabilizer に一時処理を返すようにしてください。

-- アルファベット列挙コルーチン
co_alpha = coroutine.create(
function()
    tbl = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }
    for i=1, 10 do
        DOut( tbl[ i ] .. "\n" )

        -- 処理をco_numコルーチンに戻します。
        coroutine.yield()
    end
end
)

-- 数値列挙コルーチン
co_num = coroutine.create(
function()
    for i=1, 10 do
        DOut( i )

        -- co_alphaコルーチンを実行します。
        coroutine.resume( co_alpha )
		
        -- 処理をタイマハンドラに戻します。
        coroutine.yield()
    end
end
)

-- タイマハンドラ(1秒タイマ)
function timer_handler()
    rtn = coroutine.resume( co_num )
    if rtn == false then
        DOut( "stop timer!!" )
        StopTimer( 1 )
    end
end


ClrMon()
ShowMon( true )
StartTimer( 1, 1000, "timer_handler" )

処理の流れ

  1. タイマハンドラで数値を列挙するコルーチン(co_num)を呼出す。
  2. co_num では数値をモニタしてからアルファベットを列挙するコルーチン(co_alpha)を呼出す。
  3. co_alpha でアルファベットをモニタしてからコルーチン(co_num)に制御を戻す。
  4. co_num はタイマハンドラに処理を戻す。

ここまでが 1秒タイマの処理です。
コルーチンの処理が終了すると coroutine.resume は false を返すので、 ここでタイマを停止してスクリプトを終了しています。 スクリプトを実行すると、デバッグモニタに次のように表示されます。

1
a
2
b
3
c
4
d
5
e
6
f
7
g
8
h
9
i
10
j
stop timer!!