2

Python の別のスレッドで作業をしようとしています。私は PyQt を使用しているので、私のスレッドは QThreads です。

作業自体には、PIL を使用して大きな画像を読み込み、画像を QImage に変換することが含まれます。

ワーカー スレッド内で画像を何度も読み込むコードの例を次に示します。

class testThread(QtCore.QThread):
    def run(self):
        while True:
            im = Image.open('c:\zheadline.tif')
            try:
                imgData = ImageQt.ImageQt(im)
                print (imgData.width())
            except:
                print ("Image load error")

画像は非常に大きい (16k) ため、実際に読み込むには数秒かかる場合があります。ただし、この間、GUI は非常に応答しなくなり、多くの場合、数百ミリ秒間フリーズします。

どうしてこれなの?私のマシンには 16 個のコアがあるので、1 つのスレッドからの作業が他のすべてのスレッドの速度を低下させる理由はありませんよね?

基本的に、ユーザー エクスペリエンスをまったく中断することなく、これらの大きな画像をバックグラウンドで読み込めるようにしたいと考えています。メインの GUI スレッドをまったく邪魔することなく、メインの作業を別のスレッドにプッシュする方法を知っている人はいますか?

その他の情報: 「thread.start()」で QThreads を開始しています。また、読み込み中に GUI が完全にフリーズするわけではありません。

4

2 に答える 2

4

The python interpreter can only run in one thread at a time (read about the Global Interpreter Lock), so probably one or both of Image.open and ImageQt.ImageQt is doing a lot of work in python without releasing the GIL.

A possible solution is to load images in a separate process and transfer the data via shared memory. I did something like this recently: http://bazaar.launchpad.net/~luke-campagnola/pyqtgraph/dev/view/head:/widgets/RemoteGraphicsView.py. See the 'remoteSceneChanged' method for how the QImage was reconstructed from shared memory.

于 2012-08-13T21:46:44.193 に答える
0

「 Python 、スレッド、Qt: ブーム!」によると、- Teijo Holzer (Kiwi Pycon 2019)Qt / qthread を使用したマルチスレッド - Giuseppe D'Angelo、および Qt ドキュメントでは、メイン スレッドの外部から次のオブジェクトを呼び出すことはできません。

  1. QWidget
  2. QQuickItem
  3. QPixmap
  4. 通常、すべての描画/可視/ウィジェット イベント

したがって、セカンダリスレッドに渡すimことが問題を引き起こしていると思われます。ImageQt.ImageQt(im)メインスレッドでそれを行うことをお勧めImage.openしますQThread

于 2021-10-28T02:57:47.863 に答える