RGSS2を知る(16)

終了方法がナゾだ。
DXRubyはWindow.loop/Input.updateでメッセージを処理するから、それを呼ばないとRuby側で終了条件を識別できなくて終わることができなくなる。
RGSS2ではGraphics.updateを呼ばなくてもウィンドウを閉じると終了してくれる。
loop do endだけ書いてもウィンドウを閉じると終わる。
どうなっているのだろう。


とりあえず、別スレッドでメッセージを処理していることが考えられる。
game.exeのスレッド数をタスクマネージャで確認すると13と出ていて、意外にスレッドが多いことがわかる。
たとえばストリーミング再生なんかもスレッドを作る必要があるから、そんな感じでいろいろやっているのだろう。
不思議なのは、別スレッドで捕まえたWM_CLOSEから、どのようにRubyのプログラムに渡して終了させているのか、だ。
Rubyのスレッドを別に作ってやりとりしているのかと思って「p Thread.list」してみたが、スレッドは1つしかなかった。
loopをオーバーライドしているのかと「100000000000.times do end」してみたが終了することができた。
Rubyレベルで細工しているわけではないようだ。
で、ひょっとしたらRubyレベルで終了してないのかと考えて、pメソッドはメッセージボックスを出すから、「END {p "1"}」としてみたらメッセージボックスが出ずに終わった。
ファイルを出力しようとしても出力されない。ENDブロックしかないプログラムを実行しても同じだった。ENDブロックが動いていないようだ。
イマイチはっきりとしたことがわからないが、何かちょっと普通じゃないことをしているのは確かだろう。
なぜなら、真面目に拡張ライブラリを作っていてはおそらく不可能だからだ。