WebWorkerを用いての検証になります。
WebWorkerとは、Web上で並列処理を実行するための機能になります。 プログラミングにおけるマルチスレッド処理と似ているような感じですが、次のような違いがあるそうです。
サブモジュールは殆ど変更ありませんが、 Workerスレッドは、DOMへの直接アクセスが出来ないので、DOMへの書込みをメッセージ送信に変更しました。
青帯の部分を postMessage で囲っています。 メインスレッドにメッセージを受ける処理も書く必要がありますが、そちらはjs内での処理になりますのであとで追加します。
今回メインモジュールの変更はありませんがコンパイルオプションが変更になるため、nim.cfgファイルの修正を行います。
19行目のメインモジュールのリンクオプションに -s BUILD_AS_WORKER=1 の追加を行いました。
htmlの修正は次のとおりです。
winodw.onload 時に、WebWorker用のスクリプトの読込と、Workerからのメッセージを受け取る処理(onmessageイベント)の追加を行っています。
WebWorker用のスクリプトは、メッセージ受信時に Emscripten の js ファイルを読み込んでいるだけです。
実行結果は以下の通り、想定通りの結果が出力されました。
動作はしましたが、これだとSDLの検証の時と同じく、--preload-fileオプションを付けることで、事前にサブモジュールの実行ファイルを読み込んでいるので、サブモジュール化している意味が半減してしまいます。
そこで次に--preload-fileオプションを外して、必要な時にサブモジュールを読み込む形に改良していきます。