2010-12-03 5 views
1


J'utilise le projet webkit2png (légèrement en annexe) pour prendre des captures d'écran sous Linux. Sur le serveur exécutant la dernière version QtWebkit et Python 2.6QtWebkit et hasPendingEvents() toujours vrai

Sur certains sites (par exemple 118114.cn) problème et l'application se bloque pour toujours. Debug montre que le problème dans cet extrait de code:

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

Version complète du code source est disponible here (lignes 270-275)

D'une certaine manière de se bloque et hasPendingEvents Chargement-événement ne peut pas être Faux.

La plupart des captures d'écran sont créées normalement, mais parfois en raison d'une URL gouttes mon application: (

Est-ce que quelqu'un sait comment résoudre ce problème et pourquoi l'événement se bloque

Répondre

0

Peut-être il y a un récurrent? Par exemple, si un curseur clignote sur une page, les événements (déclenchement de la minuterie, affichage invalide, peinture, ..) seront disponibles en continu

Vous devrez probablement insérer une logique de temporisation pour que la boucle se termine, si elle fonctionne depuis trop longtemps déjà

1

J'utilise aussi webkit2png + Linux, et j'ai rencontré le problème que vous avez décrit lors d'un test en local sur mon MacBook Pro. Le problème semble être que QApplication.hasPendingEvents() renvoie incorrect True et la boucle while se bloque. J'ai travaillé autour de ce problème en supprimant la boucle while:

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

Notez que vous aurez également besoin de faire ce changement __WebkitRendererHelper.render dans quelques endroits. Tout a fonctionné pour moi après avoir fait ces changements - bonne chance. Edit: Je crois que j'ai résolu ce problème du côté Linux à l'origine en mettant à jour la bibliothèque QT sous-jacente. La version par défaut pour Ubuntu 10.04 LTS (4.6.2) a un bug qui est corrigé dans les versions ultérieures. Voici mes informations d'installation:

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. 
1

J'ai mis à jour libqtcore4 mais cela ne l'a pas corrigé pour moi. Je devais faire les changements suggérés par Jeremy à webkit2png.py

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

autour de la ligne 230, il y a deux appels à hasPendingEvents() aussi

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() exécutera tous les événements en attente pour jusqu'à un maximum de 3 secondes. Cela fonctionne bien pour moi jusqu'ici. Les sites Web qui ne s'afficheraient pas apparaissent maintenant sans aucun problème. Si vous avez besoin de plus de 3 secondes (serveur occupé?), La boucle while sur 235 a besoin d'un délai d'expiration.

Questions connexes