0

これが、才能のあるコーダー仲間に伝えたい問題です。私は、JavaScript と通信できる C++ で記述されたカスタム Web コンテナーを持っています。C++ から JS へは同期 JS 関数呼び出しを行うことができます JS から C++ へは非同期 C++ 関数呼び出しを行うことができます

これらのツールを使用すると、JS から C++ への同期呼び出しを行う必要があります... メッセージ通信システムを使用できないため (何かを見逃さない限り、メイン スレッドで非同期性を意味するため)、最初に推測したのはワーカー スレッドを使用することでした。

「main.js」ファイル

    var synctools = false;
    var syncdata ="";
    var myworker=new worker("demo_workers.js");
    while(synctool == false){} //It s ugly but i haven t had any other ideas

「demo_workers.js」ファイル

    CallCPPFile(param,callback); //call the c++ and c++ call callback when finished
    function callback(data)
    {
      //do stuff
      syncdata = data;
      synctools = true; //this is supposed to stop the looping of the main js
    }

残念ながら、synctools と syncdata はワーカー スレッドからアクセスできません。そこで、いくつか質問があります:

  • ワーカーとメインスレッド間の別の通信方法はありますか? ナビゲーター オブジェクトを使用しようとしましたが、どちらも機能していないようです (2 つのスレッド間で同じナビゲーター オブジェクトかどうかはわかりません)。
  • Web ワーカー以外に、目標を達成できる別の方法はありますか? (私も運がなかった約束を試みました)

ご協力いただきありがとうございます

4

1 に答える 1

0

これがあなたの問題の基本です。非同期システムでの同期には、双方が協力する必要があります。あなたの問題は、完全に分離して実行されているコードは、それ自体が更新されない限り、そのデータを更新できないことです。すべての JavaScript スレッドは互いに完全に分離されているため、待機を実行できる何らかの外部呼び出し可能オブジェクトを作成しない限り、行き詰まります。この問題を完全に JavaScript で解決する方法はありません。

ただし、C++ をもう少し書くことを気にしない場合は、不器用なことをして、何かを機能させることができます。

マルチスレッドのミニ HTML サーバーを作成します。ID (呼び出し元によって提供される) をパラメーターとして取得し、データのストレージ ポイントを作成して待機するようにサーバーを設計します。ID とデータをパラメーターとして受け取るようにサーバーを設計します。データ パラメータを受信すると、受信した ID に関連付けられたストレージ ポイントが設定され、ID に関連付けられた待機が削除されます。

これにより、1 つの JavaScript スレッドが、同期 AJAX 要求を使用して別のスレッドで待機できるようになります。唯一の要件は、待機中のスレッドが postMessage を使用して、待機する前に待機 ID を宛先スレッドに送信することです。

よく考えてみると、別のスレッドで http サーバーを作成できる限り、純粋な JavaScript でこのようなことを行うこともできます。秘訣は、応答の準備ができるまで http 接続を開いたままにすることです。それはすべて、作業している JavaScript 環境の種類によって異なります。

于 2016-04-24T08:33:58.057 に答える