2013-10-21 11 views
13

In QT 4.8.4 Ich habe einige beliebige Javascript über einen Rückruf in C++ ausgeführt wird:QT: Javascript langsam (es sei denn, ich an der Konsole anmelden)

myWebElement->evaluateJavaScript(myScript); 

nun das Testskript war:

$(this).css('border', 'solid 10px #000') 

, die gearbeitet, aber es dauerte ein paar Sekunden zu laufen, und lief die CPU 100% auf.

Dann während des Testens habe ich "; console.log ('X')" hinzugefügt, während das Skript zu debuggen, um zu sehen, den Hangup zu lokalisieren ... Und es sofort ausgeführt!

Ich habe festgestellt, dass die Skripts so effizient wie erwartet funktionieren, solange ich mich an der Konsole anmelde. Sobald ich die Konsolenprotokollierung entferne, verlangsamt sich die Leistung zu einem Crawl. Es spielt keine Rolle, ob ich mich direkt im Skript anmelde oder das Log in C++ hinzufüge.

Irgendwelche Ideen? Ich würde es hassen, wenn ein Hack wie unten in meinem Programm herumläuft.

myWebElement->evaluateJavaScript(myScript + "; console.log('X')"); 

UPDATE:

Sieht aus wie dieser Fehler durch die Anzahl der Elemente auf der Seite betroffen ist. Es gibt eine Tabelle, in Fällen, in denen es nur ein oder zwei Zeilen gibt, gibt es keinen CPU-Hochlauf. Bei 600 Zeilen gibt es mehrere Sekunden maximaler CPU-Auslastung. Auch wenn es am Ende einen console.log-Befehl gibt, gibt es selbst bei 600 Zeilen keinen CPU-Hochlauf.

(auch hinzugefügt Version Info auf die Frage)

UPDATE 2:

Nach der Prüfung, ich muss, ich habe nichts in die Konsole für den Hack passieren funktionieren nicht muss sogar log anrufen. Ich kann "; Konsole" anhängen; zu dem Skript und es wird immer noch sofort funktionieren. Ich habe auch getestet, eine Rückkehranweisung zum Ende hinzuzufügen, die nicht funktionierte.

+0

Bitte geben Sie an, welche Version von Qt – ksimons

+0

Entwickeln auf QT 4.8.4, Kubuntu Linux 13.10 – Kver

Antwort

16

Das Problem ist, dass Qt den Rückgabewert der letzten Anweisung in Javascript auswertet und in eine QVariant konvertiert. Es wurde zeitaufwendig, weil jQuery das jQuery-Objekt zurückgab, das von Qt - und rekursiv - vollständig ausgewertet wurde. Dies verbraucht auch RAM.

Es war nicht console.log, das das Problem behob, es war der "Null" Wert, den es zurückgab. Ich testete und das Heften von "null" am Ende des Skripts funktionierte ebenfalls. Unten ist der aktualisierte Code.

myWebElement-> evaluateJavaScript (myScript + "; null");

+2

Kann nicht widerstehen zu kommentieren * Wow *, während eine mentale Notiz zu denken, alle sprachübergreifenden Schnittstellen Situationen wie diese durch sehr sorgfältig! – hyde

+0

es ist nicht nur exec, es ist eval; Trete nicht auf deinen Schwanz ... – dandavis

+0

Das hat mir nur eine Menge Zeit erspart, danke dafür! – Alosyius

Verwandte Themen