もぐてっく

人は1つ歳を取る度、1ビットづつ大きくなれると信じてた。

textbringerで時計マクロを書いてみた

textbringerで非同期な処理はどう書けばいいかな?と思って、試しに時計を作ることに。

非同期処理はスレッドを勝手に立てればいいとして、気になるのはオレオレスレッドとUIスレッドとの通信手段です。

GUIツールキットはシングルスレッドを前提に設計されているものも多く、別スレッドから無理に操作をすると、誤動作したりバカよけの例外が発生したりします。
そのため、別のスレッドからUIスレッドに指令を出す「スレッド間通信」が必要になるわけです。

textbringerでは、任意のブロックをUIスレッドで実行してくれるController::next_tick()と言うメソッドが用意されていました。バッチリですね。
(mikutterで言うDelayerですね。)

と、言うわけでこんなコードを書いてみました。
ミニバッファを更新(UI操作)する部分を、next_tick()でUIスレッドにお願いしています。

Thread.new {
  loop {
    sleep(0.5)

    Controller.current.next_tick {
      message("#{Time.now}")
    }
  }
}

下の画像の通り、ミニバッファが時を刻み始めました。
非同期処理なのでキーボード入力など他の操作を阻害することもありません。いい感じです。

f:id:moguno:20170411015126p:plain

おまけ

next_tick()はわかったけど、お前の1tickってなんぼやねん?
=>実測してみましたが、1msっぽいです。