2010-11-21 1 views
0

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

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

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

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

Выполнение вызовов (/ над кодом), инициированных с помощью 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, или, как я буду использовать это сломанные или неправильно, соответственно (может быть, я могу добавить больше деталей, если это необходимо) [править: кажется, нет, просто обычный блокирующий вызов]

  • гаджеты google «знают о» wscript.shell и carrie

  • Я мог бы явным образом создать рабочий поток для кода блокировки (я не могу найти что-либо в явном управлении потоками в гаджетах). [edit: unanswered!] изменить: невозможно; Javascript имеет одну нить]

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

ответ

0

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

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

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

+0

Thanks; что если DLL, которую я использую, не имеет обратного вызова, и у меня нет контроля над DLL? Должен ли я смотреть на завершение вызовов DLL в отдельной программе? Также как это объяснение вписывается в пример запуска wscript, который я написал выше? Нет очевидного вызова, он кажется синхронным, и все же пользовательский интерфейс гаджета и другие виджеты продолжают работать. – Michael

+0

Я не эксперт в DLL или WScript.Shell, но я бы обернул команду в сценарий оболочки, возможно, используя файл для сохранения результата. Что-то вроде: 'launch.bat' - запускает команду блокировки и перенаправляет вывод в файл. 'poll.bat' - проверяет файл для вывода и возвращает его, если он доступен. Затем я создам 'setTimeout()' в javascript и запускаю 'poll.bat' каждые 500 мс или около того, указывая на прогресс для пользователя. Ожидание. –

+0

Спасибо, без каких-либо других идей я пойду с этим (хотя poll.bat также может быть javascript в основной программе). Я хотел бы знать, что делает wscript.shell работать по-другому с любым другим блокирующим вызовом, хотя ... – Michael