スレッドのイベント

以下のようなイベントというものがよくわからなかった。音楽的にMIDIキーボードやパソコンキーボードの入力待ちとごっちゃになっていて理解できていなかったのです。

Event e;

このイベントはキーボードがどうだとかではなく、スレッドで効果的に使用できます。以前この日記でも取り上げましたけど「ベースを関数でまとめて、関数でまとめたドラムも同時に鳴らしたい場合は、、、」このような場合、以下のようにまとめました。

fun void bass()
{
    while( true )
    {
        <<<"bass">>>;
        2::second => now;
    }
}
fun void drum()
{
    while( true )
    {
        <<<"drum">>>;
        2::second => now;
    }
}
spork ~ bass();
spork ~ drum();
10::second => now;

このコードにイベントを加えます、上のように時間を指定しないでイベントがあるまで待つようにする。

Event e;
fun void bass(Event event)
{
    while( true )
    {
        event => now;
        <<<"bass">>>;
    }
}
fun void drum(Event event)
{
    while( true )
    {
        event => now;
        <<<"drum">>>;
    }
}
spork ~ bass(e);
spork ~ drum(e);
repeat(8)
{
   e.broadcast();
   0.1::second => now;
}

イベントがあるまで待つはevent=>now;の所さんです。ではイベントとは何処かというとe.broadcast();になります。0.1秒毎にベースとドラム同時にイベントを送ります。
さてe.broadcast();をe.signal();に変えて実行してみてください。どうでしょう出力されます回数が減ります。それはsignalはスレッドの1つづつだけ。broadcastはスレッド全部。これは覚えておくと便利そうです。