Возьмите свой средний гаджет 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 имеет одну нить]
Завершение вызова блока во внешней программе, файл опроса для обновления статуса (см. ответ)