コルーチン(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" )
処理の流れ
- タイマハンドラで数値を列挙するコルーチン(co_num)を呼出す。
- co_num では数値をモニタしてからアルファベットを列挙するコルーチン(co_alpha)を呼出す。
- co_alpha でアルファベットをモニタしてからコルーチン(co_num)に制御を戻す。
- 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!!