Graphenlayouts in Web-Worker-Threads ausführen

Wenn Sie das Graphenlayout auf der Clientseite ausführen, laufen Sie Gefahr, die Benutzerschnittstelle des Browsers zu blockieren, während das Layout ausgeführt wird. Sie können die Browserblockierung verhindern, indem Sie das Layout in einem Web-Worker-Thread oder auf einem Server ausführen. Zum Anzeigen eines von einem Web-Worker angelegten Graphen müssen die Clientbrowser HTML-5-Web-Worker-Threads unterstützen. Web-Worker-Threads werden von den neuesten Chrome- und Firefox-Browsern unterstützt, aber momentan (d. h. zum Zeitpunkt der Erstellung dieses Dokuments) nicht in Internet Explorer.
Für das Graphenlayout von Web-Worker-Threads konfigurieren Sie die Layoutalgorithmen in einer Graph-Instanz mithilfe der Standardmethoden setNodeLayout und setLinkLayout. Anstatt die Methode performGraphLayout aufzurufen, erstellen Sie eine Instanz von WebWorkerLayout mit dem Graphen als Argument. Anschließend rufen Sie die Methode layout dieser Instanz auf. Das Graphenlayout wird asynchron in einem separaten Thread ausgeführt.
Hinweis
Wie bei allen Multithreadanwendungen müssen Sie Ihre Anwendung für die asynchrone Ausführung des Graphenlayouts entwerfen. Ihre Anwendung darf den Graphen nicht ändern, während das Layout ausgeführt wird. Andernfalls werden alle Änderungen, die auf der Clientseite vorgenommen werden, bei der Ausführung des Layouts überschrieben.
Führen Sie Graphenlayouts, wie im folgenden Beispiel gezeigt, in einem Web-Worker-Thread der HTML Version 5 aus:
var treeLayout = new ibm_ilog.graphlayout.tree.TreeLayout();
graph.setNodeLayout(treeLayout);
var workerLayout = new ibm_ilog.graphlayout.WebWorkerLayout(graph);
var deferred = workerLayout.layout();
Die Methode layout in der Instanz von WebWorkerLayout kehrt sofort zum aktuellen Thread zurück, ohne auf den Abschluss der Graphenlayoutausführung zu warten. Die Benutzerschnittstelle des Browsers bleibt aktiv, und Ihre Anwendung kann mit anderen Verarbeitungsschritten fortfahren. Nach Abschluss der Graphenlayoutausführung werden die neuen Knotenpositionen und Linkformen automatisch auf den Graphen angewendet.
Die Initialisierungszeit bei der Ausführung eine Graphenlayouts in einem Web-Worker-Thread ist erheblich, da der Thread vom Hauptanwendungsthread isoliert ist. Der Web-Worker-Thread muss den Code des Graphenlayoutalgorithmus und einige Teile des Dojo-Codes erneut laden. Wenn Sie denselben Graphenlayoutalgorithmus mehrfach ausführen, können Sie diese Verarbeitungszeit bei nachfolgenden Layouts verkürzen, indem Sie dieselbe WebWorkerLayout-Instanz verwenden.
Hinweis
Die Klasse WebWorkerLayout gleicht in der Verwendung der Klasse ServerSideLayout. Da das Layout jedoch vom Browser ausgeführt wird, ist keine separate Installation der Web-Service-Komponente erforderlich. Informationen zum serverseitigen Layout finden Sie unter Graphenlayouts auf einem Server.

Callbacks hinzufügen

Die Methode layout in der Instanz WebWorkerLayout gibt ein dojo.Deferred-Objekt zurück, das verwendet werden kann, um Sie über den Abschluss des Layouts zu benachrichtigen. Rufen Sie die Methode addCallback des dojo.Deferred-Objekts auf, um die Benachrichtigung anzugeben. Im folgenden Beispiel wird eine Schaltfläche während der Ausführung des Layouts inaktiviert und nach Abschluss des Layouts wieder aktiviert.
dijit.byId("layoutButton").attr("disabled", true);
var deferred = workerLayout.layout();
deferred.addCallback(function(){
   dijit.byId("layoutButton").attr("disabled", false); 
});
Sie können das dojo.Deferred-Objekt auch verwenden, um sich über Fehler während der Ausführung des Graphenlayouts benachrichtigen zu lassen. Rufen Sie die Methode addErrback für die Benachrichtigung über Layoutfehler, wie im folgenden Beispiel gezeigt, auf:
deferred.addErrback(function(e){ 
   alert(e);
   dijit.byId("layoutButton").attr("disabled", false);
});

Web-Worker-Thread stoppen

Sie können die Layoutausführung stoppen, indem Sie die Methode stop des WebWorkerLayout-Objekts aufrufen. Diese Methode unterbricht den Web-Worker-Thread, ohne den Graphen zu ändern:
workerLayout.stop();