1

ユーザーのマシンでローカル プロセスを呼び出し、stdout をブラウザーに戻すカスタム ブラウザー プラグイン (FireBreath で構築) があります。これを行うには、popen() 呼び出しを介してプロセスを実行し、パイプ JSAPI イベントを発生させ、ブラウザに送り返します。

ブラウザーで、出力をフォーマット済みのテキストとして div に追加し、div に一番下までスクロールするように指示します。

ブラウザ プラグインのコード:

FILE* in;
if(!(in = _popen(command_string, "r")))
{
    return NULL;
}

while(fgets(buff, sizeof(buff), in)!=NULL)
{
    send_output_to_browser(buff);
}

HTML & Javascript/jQuery:

<pre id="sync_status_window" style="overflow:scroll">
    <span id="sync_output"></span>
</pre>


var onPluginTextReceived = function (text)
{
    $('#sync_output').append(text);   
    var objDiv = document.getElementById('sync_status_window');
    objDiv.scrollTop = objDiv.scrollHeight;
}

この方法は、私が必要とするブラウザでは機能しますが (これは内部ツールの使用が制限されています)、イライラするほどラグがあります。私のプロセスは通常、出力ウィンドウのスクロールが完了する 30 ~ 60 秒前に終了します。では、これをより効率的にするにはどうすればよいでしょうか。このテキストをブラウザに戻すより良い方法はありますか?

4

1 に答える 1

2

可能性があると思われる最適化が 2 つあります。

  1. pre と span への参照を保持し、dom ツリーの検索を繰り返し続けます。これは非常にコストがかかります。
  2. C 側 (推奨) または JS 側で、出力をチャンクアップします。

クイックハックの場合(実行する必要があるjqueryへの依存を削除せずに)、次のようになります

//Higher or global scope
var pluginBuffer=[];
var pluginTimeout=false;
var sync_status_window=document.getElementById('sync_status_window');

function onPluginTextReceived(text)
{
    pluginBuffer[pluginBuffer.length]=text;
    if (!pluginTimeout) pluginTimeout=window.SetTimeout('onPluginTimer();',333);
}

function onPluginTimer()
{
    var txt=pluginBuffer.join('');
    pluginBuffer=[];
    pluginTimeout=false;
    $('#sync_output').append(text);
    sync_status_window.scrollTop = sync_status_window.scrollHeight;
 }

ニーズに合わせて、1 秒あたり 3 回の更新に 333 ミリ秒を選択しました

于 2012-02-03T21:37:20.723 に答える