音楽プレイヤに開発から派生して以下のことをやった。
mthread_kill を追加。
- mthread_create の戻り値(スレッドハンドル) を元にkillできる
- 今まで syscall_kill_threadを利用していたんだけど、こちらは引数が tid なので不便だった
- ちなみに mthread_xxx はsyscall_mthread_xx にマッピングされていて前者を使う方が良さげ
MonAPI::Threadを追加
プレイヤを作っているときに mthread_xxx 関数をそのまま使うとむきだしで嫌だなぁと思ったのがきっかけ。
bayguiのThreadを使うことも検討したのだけど
- Runnableを用意するのが面倒
- 止められない
- スレッド終了のnotifyがない
ということで今回の用途には合わないので自作してみた。
TinoさんがbayguiのThreadで一工夫していたあれこれを利用させてもらいました。
インターフェースは
Thread(void (*run)(void*), void* arg, void (*notify)()); virtual ~Thread(); void start(); void stop();
run がスレッドとして走らせたい関数。
arg はその引数(NULLでも構わない)
notify はスレッドが終了するときに callback される関数(NULLでも構わない)
以下のように使います。現在 mona-stdio ブランチに置いてあります。
static void hoge(void* arg)
{
const char* m = (const char*)arg;
for (int i = 0; i < 3 ; i++)
{
sleep(3000);
syscall_print(m);
}
}
static void hogeDone()
{
syscall_print("hoge done\n");
}
int MonaMain(List<char*>* pekoe)
{
MonAPI::Thread* thread = new MonAPI::Thread(hoge, (void*)"message from hige\n", hogeDone);
thread->start();
sleep(4000);
thread->stop();
printf("stopped\n");
}複数スレッドとかには対応していないんだけど、自分がGUIでマルチスレッドを使いたかったのはこれくらいの機能で十分でした。
スレッドをばりばり使っていそうな EDS1275 さんの要望があれば、いろいろと機能追加しても良いかなと思っていますがどうでしょう。
今回音楽プレイヤを作っていて、いろいろな不満点を深追いして改良しようと意識的につとめていて、思ったことが1つ。
ライブラリ開発者はそのライブラリをきちんと使わないとダメな予感。(自戒もこめて)
そんなことは頭では分かっているつもりでしたが、強く意識した方が良さそうです。
簡単なサンプルを書いて、それが動けば終了じゃなくて本格的なアプリをがっつり作って改善していかないと
ライブラリを使用する側に大きな負担をかけてしまいます。
ライブラリ開発者は誰よりも、そのライブラリのユーザーでなければいけないなぁと反省しました。