さっき決めたブログ

[Nim]WebAssemblyでモジュールのダイナミックリンクを行う

検証2 (WebWorkerを使用する)

WebWorkerを用いての検証になります。

WebWorkerとは、Web上で並列処理を実行するための機能になります。 プログラミングにおけるマルチスレッド処理と似ているような感じですが、次のような違いがあるそうです。

  • メモリ空間が別になるので変数とか共有できない。他のWorkerと情報のやり取りはメッセージ通信のみで行う。
  • 処理が終わってもWorkerは破棄されずに待機状態となる。

サブモジュールの修正

サブモジュールは殆ど変更ありませんが、 Workerスレッドは、DOMへの直接アクセスが出来ないので、DOMへの書込みをメッセージ送信に変更しました。

青帯の部分を postMessage で囲っています。 メインスレッドにメッセージを受ける処理も書く必要がありますが、そちらはjs内での処理になりますのであとで追加します。

コンパイルオプションの変更

今回メインモジュールの変更はありませんがコンパイルオプションが変更になるため、nim.cfgファイルの修正を行います。

19行目のメインモジュールのリンクオプションに -s BUILD_AS_WORKER=1 の追加を行いました。

htmlの修正とWorker用のJSの作成

htmlの修正は次のとおりです。

winodw.onload 時に、WebWorker用のスクリプトの読込と、Workerからのメッセージを受け取る処理(onmessageイベント)の追加を行っています。

WebWorker用のスクリプトは、メッセージ受信時に Emscripten の js ファイルを読み込んでいるだけです。

実行結果

実行結果は以下の通り、想定通りの結果が出力されました。

実行結果

動作はしましたが、これだとSDLの検証の時と同じく、--preload-fileオプションを付けることで、事前にサブモジュールの実行ファイルを読み込んでいるので、サブモジュール化している意味が半減してしまいます。
そこで次に--preload-fileオプションを外して、必要な時にサブモジュールを読み込む形に改良していきます。

投稿者プロフィール

KARASU
うーん いろいろ考え中。。。

コメント

コメント取得中...

関連記事

TOPへ