Nehmen Sie Ihre durchschnittliche Google Desktop-Gadget. Fügen Sie den folgenden Code:Wie kann ein Google Desktop-Gadget seine Benutzeroberfläche aktualisieren (Benutzereingaben verarbeiten), während der zugrunde liegende Code belegt/blockiert ist?
debug.trace("go!"); for (var i = 0; i < 100000000; i++) { // google desktop stops responding j = 12 * i; } debug.trace("finished");
Alle Google Desktop-Gadgets perren/Gefrier für die Dauer, das Gadget einschließlich der Code in ausgeführt wird (die normale Zweischichtkombination nicht funktioniert, können Sie Verschiebe keine Gadgets oder interagiere mit ihnen auf andere Weise, das Systray-Icon reagiert zwar, tut aber nichts - zB wird die Optionsseite erst geladen, wenn der Code fertig ist.
Ich suche nach einem Weg um diese allgemeine Situation (mein Fall ist, ich mache externe Funktionsaufrufe über eine DLL, die eine lange Zeit dauern, siehe gmanifest 'install' Element).
Wenn die Aufrufe (/ über Code) über setInterval/setTimeout ausgelöst werden, scheint das keinen Unterschied zu machen, noch wird Code, der normalerweise von einem Timer aufgerufen würde, ausgeführt, während der lange Aufruf stattfindet.
ich dies unter der Annahme ist möglich, weil, wenn Sie den folgenden Code anstelle des geschäftigen Schleife versuchen oder meine externe Funktion Anrufblockierung, nichts sperrt:
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
I don‘ Ich weiß, was der Unterschied zwischen diesen drei Fällen ist. Irgendwelche Ideen und noch wichtiger, irgendwie herum?
Gedanken:
Die geschäftige Schleife als solche nicht blockiert, sondern nur alle Prozessorzeit, so daher nicht repräsentativ nichts passiert ist (scheint unwahrscheinlich) [edit: nein, es blockiert ]
Die DLL oder so, wie ich bin mit ihm gebrochen oder falsch ist, bzw. (bei Bedarf hinzufügen können, könnte ich mehr Details) [edit: scheint nicht nur ein normaler blockierenden Aufruf]
Google Gadgets "kennt" wscript.shell und carrie s geht weiter, während "run" blockiert (scheint unwahrscheinlich) [edit: unbeantwortet!]
Ich könnte explizit einen Worker-Thread für den Blocking-Code generieren (Ich kann nichts über die explizite Thread-Steuerung in Gadgets finden) [ bearbeiten: nicht möglich; Javascript hat einen einzigen Thread]
den Bausteinaufruf in einem externen Programm, Umfrage-Datei für Status-Updates Wrap up (siehe Antwort)
Dank; Was passiert, wenn die DLL, die ich verwende, keinen Rückruf hat und ich keine Kontrolle über die DLL habe? Sollte ich das Wrapping betrachten, ruft die DLL in einem separaten Programm auf? Auch wie paßt diese Erklärung mit dem wscript Laufe Beispiel in denen ich oben geschrieben? Es gibt keinen offensichtlichen Rückruf, es scheint synchron zu sein, und dennoch laufen die UI des Gadgets und andere Widgets weiter. – Michael
Ich bin kein Experte auf DLLs oder WScript.Shell, aber ich würde den Befehl in einem Shell-Skript wickelt, möglicherweise eine Datei mit dem Ergebnis zu speichern. Etwas wie: 'launch.bat' - startet den Blockierbefehl und leitet die Ausgabe in eine Datei um. 'poll.bat' - prüft die Datei auf Ausgabe und gibt sie, falls verfügbar, zurück. Dann würde ich eine 'setTimeout()' in Javascript und führen Sie die 'poll.bat' alle 500ms oder so, den Fortschritt für den Benutzer anzuzeigen. Ein hektisches Warten. –
Danke, keine anderen Ideen werde ich mit diesem gehen (obwohl poll.bat kann auch nur der JavaScript im Hauptprogramm). Ich würde gerne wissen, was die wscript.shell läuft anders als jede andere blockierende Anruf obwohl ... – Michael