Reputation: 91
I use project webkit2png (slightly appended) to take screenshots in Linux. On the server running the latest version QtWebkit and Python 2.6
On some sites (eg 118114.cn) problem and the application hangs forever. Debug shows that the problem in this code snippet:
while self.__loading:
if timeout > 0 and time.time() >= cancelAt:
raise RuntimeError("Request timed out on %s" % url)
while QApplication.hasPendingEvents():
QCoreApplication.processEvents()
Full version of the source code is available here (lines 270-275)
Somehow Loading-event hangs and hasPendingEvents can not be False.
Most of the screenshots are created normally, but sometimes due to some URL drops my app: (
Does anyone know how to solve this problem and why the event hangs?
Upvotes: 1
Views: 757
Reputation: 21
I upgraded libqtcore4 but that didn't fix it for me. I had to make the changes suggested by Jeremy to webkit2png.py
# aptitude show libqtcore4
Package: libqtcore4
State: installed
Automatically installed: no
Version: 4:4.7.2-0ubuntu6.1
around line 230 there are two calls to hasPendingEvents() also
229 while time.time() < waitToTime:
230 #while QApplication.hasPendingEvents():
231 QApplication.processEvents()
232
233 # Paint this frame into an image
234 #self._window.repaint()
235 #while QApplication.hasPendingEvents():
236 QApplication.processEvents()
processEvents() will run all pending events for up to a max of 3 seconds. It's working ok for me so far. The websites that would not render are now appearing without any problems. If you need longer than 3 seconds (busy server?) then the while loop on 235 needs a timeout.
Upvotes: 1
Reputation: 1719
I'm also using webkit2png + Linux, and encountered the issue you've described when testing locally on my MacBook Pro. The issue appears to be that QApplication.hasPendingEvents() incorrectly returns True, and the while loop hangs. I worked around this issue by removing the while loop:
while self.__loading:
if timeout > 0 and time.time() >= cancelAt:
raise RuntimeError("Request timed out on %s" % url)
QCoreApplication.processEvents()
Note you'll also need to make this change in __WebkitRendererHelper.render in a couple of spots. Everything worked for me after making these changes- good luck.
Edit: I believe I solved this problem on the Linux side of things originally by upgrading the underlying QT library. The default version for Ubuntu 10.04 LTS (4.6.2) has a bug which is fixed in later versions. Here's my installation info:
Package: libqtcore4
State: installed
Automatically installed: yes
Version: 4:4.7.0-0ubuntu2~lucid1~ppa1
Priority: optional
Section: libs
Maintainer: Kubuntu Developers <[email protected]>
Uncompressed Size: 7,471k
Depends: libc6 (>= 2.9), libgcc1 (>= 1:4.1.1), libglib2.0-0 (>= 2.12.0), libstdc++6 (>= 4.1.1), zlib1g (>= 1:1.1.4)
Breaks: libqt4-core (< 4.4.0~beta1-1), libqt4-gui (< 4.4.0~beta1-1)
Replaces: libqt4-core (< 4.4.0~beta1-1), libqt4-gui (< 4.4.0~beta1-1)
Description: Qt 4 core module
Qt is a cross-platform C++ application framework. Qt's primary feature is its rich set of widgets that provide standard GUI
functionality.
The QtCore module contains core non-GUI functionality.
Upvotes: 1
Reputation: 12561
Maybe there is a recurring timer? For example, a blinking cursor on a page will cause the events (timer fires, view invalidate, paint, ..) to be available continuously.
You probably need to insert a timeout logic so that while loop exits, if it is running for far too long already.
Upvotes: 0