4

概要: 当社では、ローカル リソース (RS232 / シリアル デバイス) にアクセスできる Web アプリケーションが必要です。いくつかの調査と POC の後、ActiveX、Java アプレットなどのオプションを破棄し、シリアル データを読み取り、HTTP プロトコルを介してそれらを提供するローカル アプリケーション (後でサービスに変換され、顧客に配布される C# で記述) を作成することにしました (必要なヘッダー + プレーンなシリアル データに応答する単純な TCP サーバー)。次に、Web アプリケーションは AJAX を実行して 'http://localhost:8080' にこれらのデータを読み取ります。

これはすべて、フォームの入力要素に入力するメッセージをメイン スレッドに投稿する while ループ内の Web ワーカーで行われます。静的コンテンツを提供することで、まともなパフォーマンスを得ることができます。Windows 上の Chrome 13 の古い Intel Dual Core (Core 2 Duo ではない) 1,6GHz CPU では、1 秒あたり 300 ~ 350 回の反復があり、Web ワーカー スレッドによって 5 ~ 9% の CPU が使用されます。

Q:私が今達成したいことは、各 ajax リクエストの後にある種の sleep() 関数を挿入することによって、Web ワーカーのポーリング間隔を調整することです。たとえば、最初に 100 ミリ秒で実験します。

スレッドで CPU リソースを犠牲にしない最適なソリューションは何でしょうか?

注: 最後の手段として、TCP サーバー コードに遅延を挿入することができます。

編集:

私は労働者の中で眠る必要があります。例 (わかりやすくするために簡略化しています):

AJAX = new XMLHttpRequest();
while (true) {
  AJAX.open("GET", "http://127.0.0.1:8080", false);
  AJAX.send(null);
  var ean = AJAX.responseText;
  if (ean != '') { postMessage(ean); }
  /* NEED TO SLEEP HERE WHETHER THE RESPONSE WAS SENT OR NOT */
}
4

2 に答える 2

1

最善の解決策はWebSocket APIだと思います。そのため、Web アプリケーションにイベント リスナーをアタッチし、何らかのアクションが必要になるたびに C# から起動することができます。

于 2011-06-21T10:18:05.150 に答える
0

残念ながら、javascript にはスリープまたは待機機能はありませんが、タイムアウトとコールバックを使用してエミュレートできます。(コールバック関数を介してコードの残りの部分に「ジャンプ」し、呼び出しを setTimeout メソッドに配置します)。

編集:

あなたはこのようなことをすることができます、

AJAX = new XMLHttpRequest();
var myInterval = setInterval( function(){
    AJAX.open("GET", "http://127.0.0.1:8080", false);
    AJAX.send(null);
    var ean = AJAX.responseText;
    if (ean != '') { postMessage(ean); }
},120);

最初の呼び出しを待たない場合は、間隔の外に配置して (すぐに実行されるように)、上記のように間隔を再度呼び出します。

于 2011-06-21T10:14:34.680 に答える