Возьмите средний гаджет для рабочего стола 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 имеет одну нить]
Итогового вызов блока во внешней программе, подушный файл для обновления статуса (см ответа)
Thanks; что если DLL, которую я использую, не имеет обратного вызова, и у меня нет контроля над DLL? Должен ли я смотреть на завершение вызовов DLL в отдельной программе? Также как это объяснение вписывается в пример запуска wscript, который я написал выше? Нет очевидного вызова, он кажется синхронным, и все же пользовательский интерфейс гаджета и другие виджеты продолжают работать. – Michael
Я не эксперт в DLL или WScript.Shell, но я бы обернул команду в сценарий оболочки, возможно, используя файл для сохранения результата. Что-то вроде: 'launch.bat' - запускает команду блокировки и перенаправляет вывод в файл. 'poll.bat' - проверяет файл для вывода и возвращает его, если он доступен. Затем я создам 'setTimeout()' в javascript и запускаю 'poll.bat' каждые 500 мс или около того, указывая на прогресс для пользователя. Ожидание. –
Спасибо, без каких-либо других идей я пойду с этим (хотя poll.bat также может быть javascript в основной программе). Я хотел бы знать, что делает wscript.shell работать по-другому с любым другим блокирующим вызовом, хотя ... – Michael