【问题标题】:QtWebkit and hasPendingEvents() always TrueQtWebkit 和 hasPendingEvents() 总是 True
【发布时间】:2010-12-03 21:27:43
【问题描述】:


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

在某些网站(例如118114.cn)出现问题,应用程序永远挂起。调试显示问题出在这段代码sn -p:

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

完整版源代码可在here(第 270-275 行)获得

Loading-event 不知何故挂起,hasPendingEvents 不能为 False。

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

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

【问题讨论】:

    标签: python events webkit qtwebkit


    【解决方案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.
    

    【讨论】:

      【解决方案2】:

      我升级了 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 循环需要超时。

      【讨论】:

        【解决方案3】:

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

        您可能需要插入一个超时逻辑,以便当 while 循环运行时间过长时退出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-06
          • 2017-05-10
          • 2013-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多