2013-10-21 14 views
13

Trong QT 4.8.4 Tôi có một số tùy ý Javascript được thực hiện thông qua một callback trong C++:QT: javascript thực hiện chậm (trừ khi tôi đăng nhập vào giao diện điều khiển)

myWebElement->evaluateJavaScript(myScript); 

Bây giờ, các kịch bản thử nghiệm là:

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

hoạt động, nhưng phải mất vài giây để chạy và chạy CPU 100%.

Sau đó trong khi thử nghiệm tôi đã thêm "; console.log ('X')" trong khi gỡ lỗi tập lệnh để xem xác định lỗi gác máy ... Và nó được thực thi ngay lập tức!

Tôi đã tìm thấy rằng miễn là tôi đang đăng nhập vào bảng điều khiển, các tập lệnh hoạt động hiệu quả như mong đợi. Ngay sau khi tôi xóa bảng điều khiển ghi nhật ký, hiệu suất sẽ chậm lại. Nó không quan trọng nếu tôi đăng nhập trực tiếp trong kịch bản, hoặc thêm nhật ký trong C++.

Bất kỳ ý tưởng nào? Tôi ghét phải có một hack như dưới đây nổi xung quanh trong chương trình của tôi.

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

UPDATE:

Hình như lỗi này bị ảnh hưởng bởi số lượng các yếu tố trên trang. Có một bảng, trong trường hợp chỉ có một hoặc hai hàng không có CPU chạy lên. Khi có 600 hàng, có một vài giây sử dụng CPU tối đa. Một lần nữa, ngay khi có lệnh console.log ở cuối, không có CPU nào chạy ngay cả với 600 hàng.

(còn thêm thông tin phiên bản cho câu hỏi)

UPDATE 2:

Sau khi thử nghiệm, tôi không cần phải vượt qua bất cứ điều gì vào giao diện điều khiển cho hack để làm việc, tôi không thậm chí cần phải gọi nhật ký. Tôi có thể nối thêm "; console;" với tập lệnh và nó vẫn hoạt động ngay lập tức. Tôi cũng đã thử nghiệm thêm một câu lệnh return vào cuối, mà không hoạt động.

+0

Vui lòng cho biết phiên bản Qt – ksimons

+0

Phát triển trên QT 4.8.4, Kubuntu Linux 13.10 – Kver

Trả lời

16

Vấn đề là Qt đang đánh giá giá trị trả về của câu lệnh cuối cùng trong Javascript và chuyển đổi nó thành QVariant. Nó trở nên tốn thời gian bởi vì jQuery đã trả về đối tượng jQuery, nó đã được đánh giá toàn bộ bởi Qt - và đệ quy về điều đó. Điều này cũng tiêu thụ RAM quá.

Không phải console.log đã khắc phục được sự cố, đó là giá trị "rỗng" mà nó trả về. Tôi đã thử nghiệm và đóng ghim "null" ở cuối tập lệnh cũng đã hoạt động. Dưới đây là mã được cập nhật.

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

+2

Không thể chống lại nhận xét * Wow *, trong khi ghi chú về tinh thần để nghĩ tất cả các tình huống giao tiếp giữa các ngôn ngữ như thế này qua rất cẩn thận! – hyde

+0

nó không chỉ là exec, nó là eval; đừng bước vào đuôi của bạn ... – dandavis

+0

Điều này chỉ giúp tôi tiết kiệm rất nhiều thời gian, cảm ơn bạn vì điều này! – Alosyius

Các vấn đề liên quan