QtWebkit и hasPendingEvents () всегда True - PullRequest
1 голос
/ 04 декабря 2010


Я использую проект webkit2png (слегка добавленный), чтобы делать скриншоты в Linux. На сервере работает последняя версия QtWebkit и Python 2.6

На некоторых сайтах (например, 118114.cn) проблема и приложение зависает навсегда. Отладка показывает, что проблема в этом фрагменте кода:

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

Полная версия исходного кода доступна здесь (строки 270-275)

Каким-то образом событие загрузки зависает, и hasPendingEvents не может быть ложным.

Большинство скриншотов создаются нормально, но иногда из-за некоторых URL-адресов удаляется мое приложение: (

Кто-нибудь знает, как решить эту проблему и почему событие зависает?

Ответы [ 3 ]

1 голос
/ 23 марта 2011

Я также использую 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 в нескольких местах.После этих изменений у меня все работало - удачи.

Редактировать: Я считаю, что я решил эту проблему на стороне Linux изначально, обновив базовую библиотеку QT.Версия по умолчанию для 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.
1 голос
/ 17 июня 2011

Я обновил libqtcore4, но это не помогло мне. Мне пришлось внести изменения, предложенные Джереми в 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 секунд (занятый сервер?), То циклу while на 235 нужно время ожидания.

0 голосов
/ 23 декабря 2010

Может быть, есть повторяющийся таймер?Например, мигающий курсор на странице приведет к тому, что события (срабатывание таймера, просмотр аннулирования, рисование, ..) будут доступны непрерывно.

Возможно, вам потребуется вставить логику тайм-аута, чтобы при выходе из циклаесли он работает слишком долго.

...