Как разрешить гаджету Google Desktop изменять свой пользовательский интерфейс (обрабатывать ввод данных пользователем), пока основной код занят / заблокирован? - PullRequest
0 голосов
/ 22 ноября 2010

Возьмите свой средний гаджет Google Desktop.Добавьте следующий код:

 debug.trace("go!");
 for (var i = 0; i < 100000000; i++) { // google desktop stops responding
      j = 12 * i;
 }
 debug.trace("finished");

Все гаджеты Google Desktop заблокированы / заблокированы на время, включая гаджет, в котором выполняется код (обычное сочетание клавиш в две смены нево время работы вы не можете перемещать гаджеты или взаимодействовать с ними любым другим способом: значок systray отзывчив, но ничего не делает - например, страница параметров не загружается до завершения кода).

Я ищу способ обойти эту общую ситуацию (в моем случае я выполняю внешние вызовы функций через DLL, для возврата которой требуется много времени, см. gmanifest элемент 'install').

Инициирование вызовов (/ выше кода) через setInterval / setTimeout, по-видимому, не имеет никакого значения, и никакой код, который обычно вызывается таймером, не выполняется во время длинного вызова.

Я предполагаю, что это возможно, потому что, когда вы используете следующий код вместо занятого цикла или мой блокирующий вызов внешней функции, ничего не блокируется:

 var wsh = new ActiveXObject("WScript.Shell");
 wsh.run("cmd.exe",1,true); // true = block until program has exited
 // UI responds in this period
 debug.trace("finished"); // occurs when cmd.exe is closed

Я не знаю, в чем разница между этими тремя случаями.Какие-нибудь идеи, и что более важно, как-нибудь обойти это?

Мысли:

  • Цикл занятости не блокируется как таковой, а просто использует все процессорное времяничего не происходит, следовательно, не является репрезентативным (кажется маловероятным) [править: нет, это блокирует]

  • DLL или способ, которым я пользуюсь, соответственно сломан или неправильн (может, Я могу добавить больше деталей, если это необходимо) [edit: кажется, нет, просто обычный вызов блокировки]

  • гаджеты Google "знают о" wscript.shell и продолжают работать, пока "бегут"блокирует (кажется маловероятным).редактировать: невозможно;javascript имеет одну нить]

  • Завершение вызова блока во внешней программе, файл опроса для обновления статуса (см. ответ)

1 Ответ

0 голосов
/ 22 ноября 2010

Javascript имеет ровно один исполняющий поток с одним стеком вызовов.Вы не можете парковать этот поток, сохраняя стек вызовов и возобновляя его позже.

Способ javascript, обеспечивающий быстрое реагирование, состоит в том, чтобы обеспечить обратный вызов, когда выполнение будет готово.Как правило, никогда не цепляйте нить и ждите, когда что-то случится.

Вот почему в AJAX есть A (асинхронный) - даже если вы можете сделать синхронный XmlHttpRequest, это обычно считается плохой идеей.

...