2012-02-03 2 views
1

У меня есть настраиваемый плагин для браузера (построенный с помощью FireBreath), который будет вызывать локальный процесс на компьютере пользователя и передать stdout обратно в браузер, для этого я запускаю процесс через вызов 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 секунд, прежде чем оконное окно завершает прокрутку. Итак, как я могу сделать это более эффективным? Есть ли лучший способ передать этот текст обратно в браузер?

ответ

2

Есть два оптимизаций я вижу потенциал:

  1. сохранить ссылку на предварительно и пролета, вы продолжаете повторять дом поиска дерева, которое является весьма дорогостоящим
  2. Кусок до выхода - либо на стороне С (предпочтительно) или на стороне 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; 
} 

Адаптация к вашим потребностям, я выбрал 333ms 3 обновлений/секунду

+1

Они, кажется, как разумное место для начала; однако я подозреваю, что проблема связана с перекрестными процессами. Я бы добавил несколько журналов и сделал некоторые профилирования, чтобы увидеть, где происходит большая часть вашего «отставания». – taxilian

+0

Я пошёл на сторону C и закрепил точки поиска DOM, теперь он более плавный. –

 Смежные вопросы

  • Нет связанных вопросов^_^