2

Web ワーカー内で実行されている (Emscripten でコンパイルされた) 巨大なコードがあります。ページは 1 つの postMessage でワーカー内のタスクを開始し、ワーカーが終了すると別の postMessage を送り返します。偉大な。ただし、実行中にワーカーを一時停止し、postMessage を介してブラウザーにメッセージを戻し、ユーザーが postMessage を介して有効な応答を送信するのを待ってから実行を終了する必要がある、追加したい新機能があります。 . ただし、機能するものは何もわかりません。メッセージの到着時に制御変数が設定されるまでワーカーを無限ループで待機させようとすると、無限ループによってワーカーのメッセージ ハンドラーの実行が妨げられるため、失敗します。例外をスローすることでワーカーの実行を中断できますが、実行を再開する方法がわかりません。

誰にもアイデアはありますか?

4

2 に答える 2

1

JS で割り込みのようなメカニズムを作成する 1 つの方法は、setTimeout(some_function,1) を使用することです。このようにして、コード some_function の実行が完了し、キューにある場合は他のイベント ハンドラーを処理できます。

このパターンは、あなたが言及した「巨大なコード」を一連のステップ (またはメソッド) に分割できるかどうかによって異なります。次のような場合は、次のように言います。

step1();
step2();
step3();

したがって、「step1」メソッドの実行中に、「割り込み」、つまり「メッセージ」イベントが発生した場合、ステップの実行が終了した後、ステップ2が開始する前に処理できます。

それはすべて、コードによって解決されている問題の性質が正確に何であるかに依存します。もう少しコンテキストが便利です。

于 2012-09-27T23:12:51.370 に答える
1

私がこれに取り組む方法は、メインの「コントローラー」ワーカーを共有 Web ワーカーとして実行することです。次に、必要に応じてそのコントローラーに他のワーカーをスピンオフさせ、 を介してメッセージ/コマンドを受け取りますpostMessage

そうすれば、共有ワーカーはメイン ループのようなものであり、物事を円滑に進めることができます。そのメイン ループで非同期処理を行うことは避けます。

于 2012-06-15T15:19:10.280 に答える