1


我使用项目 webkit2png(略微附加)在 Linux 中截屏。在运行最新版本 QtWebkit 和 Python 2.6 的服务器上

在某些网站(例如 118114.cn)上出现问题并且应用程序永远挂起。调试显示此代码段中的问题:

while self.__loading:
   if timeout > 0 and time.time() >= cancelAt:
      raise RuntimeError("Request timed out on %s" % url)
   while QApplication.hasPendingEvents():
      QCoreApplication.processEvents()

完整版本的源代码可在此处获得(第 270-275 行)

不知何故,加载事件挂起,hasPendingEvents 不能为 False。

大多数屏幕截图都是正常创建的,但有时由于某些 URL 丢失了我的应用程序:(

有谁知道如何解决这个问题以及为什么事件会挂起?

4

3 回答 3

1

我也在使用 webkit2png + Linux,并且在我的 MacBook Pro 上进行本地测试时遇到了您描述的问题。问题似乎是 QApplication.hasPendingEvents() 错误地返回 True,并且 while 循环挂起。我通过删除 while 循环解决了这个问题:

while self.__loading:
   if timeout > 0 and time.time() >= cancelAt: 
      raise RuntimeError("Request timed out on %s" % url) 
   QCoreApplication.processEvents()

请注意,您还需要在几个地方对 __WebkitRendererHelper.render 进行此更改。做出这些改变后,一切都对我有用——祝你好运。

编辑:我相信我最初通过升级底层 QT 库在 Linux 方面解决了这个问题。Ubuntu 10.04 LTS (4.6.2) 的默认版本有一个错误,该错误已在以后的版本中修复。这是我的安装信息:

Package: libqtcore4
State: installed
Automatically installed: yes
Version: 4:4.7.0-0ubuntu2~lucid1~ppa1
Priority: optional
Section: libs
Maintainer: Kubuntu Developers <kubuntu-devel@lists.ubuntu.com>
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.
于 2011-03-23T10:05:29.627 回答
1

我升级了 libqtcore4,但这并没有为我解决。我必须对 Jeremy 建议的更改 webkit2png.py

# aptitude show libqtcore4
Package: libqtcore4
State: installed
Automatically installed: no
Version: 4:4.7.2-0ubuntu6.1

在第 230 行附近,还有两次对 hasPendingEvents() 的调用

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() 将运行所有未决事件最多 3 秒。到目前为止,它对我来说工作正常。不会呈现的网站现在出现没有任何问题。如果您需要超过 3 秒(繁忙的服务器?),那么 235 上的 while 循环需要超时。

于 2011-06-17T15:36:03.527 回答
0

也许有一个循环计时器?例如,页面上的闪烁光标将导致事件(计时器触发、视图无效、绘制......)持续可用。

您可能需要插入一个超时逻辑,以便 while 循环退出,如果它已经运行了太长时间。

于 2010-12-23T03:49:36.370 回答