1


Linuxでスクリーンショットを撮るのにプロジェクトwebkit2png(少し追加)を使用しています。最新バージョンのQtWebkitとPython2.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行目)

どういうわけかLoading-eventがハングし、hasPendingEventsをFalseにすることはできません。

ほとんどのスクリーンショットは正常に作成されていますが、URLによってアプリがドロップすることがあります:(

この問題を解決する方法と、イベントがハングする理由を知っている人はいますか?

4

3 に答える 3

1

libqtcore4 をアップグレードしましたが、問題は解決しませんでした。Jeremy が提案した変更を webkit2png.py に加える必要がありました

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

230 行目あたりには、hasPendingEvents() への呼び出しも 2 つあります。

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 秒間実行します。これまでのところ、問題なく動作しています。表示されなかった Web サイトが問題なく表示されるようになりました。3 秒以上必要な場合 (サーバーがビジー状態ですか?)、235 の while ループにはタイムアウトが必要です。

于 2011-06-17T15:36:03.527 に答える
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 に答える
0

たぶん、繰り返しタイマーがありますか?たとえば、ページ上でカーソルが点滅すると、イベント (タイマー起動、ビューの無効化、ペイントなど) が継続的に利用可能になります。

while ループがすでに長時間実行されている場合は、タイムアウト ロジックを挿入して、while ループが終了するようにする必要があります。

于 2010-12-23T03:49:36.370 に答える