Спите внутри веб-работника JavaScript, не жертвуя ресурсами процессора - PullRequest
3 голосов
/ 21 июня 2011

Обзор: Наша компания нуждается в веб-приложении, которое имеет доступ к локальным ресурсам (RS232 / последовательные устройства). После некоторых исследований и POC мы отказались от таких опций, как ActiveX, Java-апплеты и решили создать локальное приложение (написанное на C #, которое позже будет преобразовано в службу и распространено среди клиентов), которое считывает последовательные данные и обслуживает их по протоколу HTTP ( простой TCP-сервер, отвечающий на необходимые заголовки + простые последовательные данные). Затем веб-приложение выполняет AJAX для 'http://localhost:8080' чтения этих данных.

Все это выполняется веб-работником в цикле while, который отправляет сообщение в основной поток, заполняя его элементом ввода формы. Служа статическому контенту, я могу получить достойную производительность. На более старом двухъядерном процессоре Intel Core (не Core 2 Duo) 1,6 ГГц в Chrome 13 в Windows выполняется 300–350 итераций в секунду, а 5–9% ЦП используется рабочим веб-потоком.

В: Чего я хочу сейчас добиться, так это уменьшить интервал опроса в веб-работнике, вставляя какую-то функцию sleep () после каждого ajax-запроса, например, эксперимент с 100 мс в начале.

Что было бы лучшим решением без потери ресурсов процессора в потоке?

Примечание: я мог бы добавить некоторую задержку в код сервера TCP в качестве крайней меры.

EDIT:

Мне нужно спать внутри рабочего. Пример (упрощенно для ясности):

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 */
}

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Я думаю, что лучшим решением будет WebSocket API . Таким образом, вы можете подключить прослушиватель событий в своем веб-приложении и запускать его из C # каждый раз, когда вам нужно какое-то действие.

0 голосов
/ 21 июня 2011

К сожалению, в 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);

Теперь, если вы не хотите ждать первого вызова, поместите его вне интервала (чтобы он выполнялся мгновенно), а затем снова вызовите интервал, как написано выше.

...