PyQt和QThreads:单独的线程仍在冻结主GUI线程?

时间:2012-08-13 19:34:45

标签: user-interface pyqt qthread

我正在尝试在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在加载时间内没有完全冻结......它变得非常迟缓和缓慢,间歇性地冻结。

1 个答案:

答案 0 :(得分:3)

python解释器一次只能在一个线程中运行(阅读全局解释器锁),因此Image.open和ImageQt.ImageQt中的一个或两个可能在python中执行大量工作而不释放GIL。

一种可能的解决方案是在单独的进程中加载​​图像并通过共享内存传输数据。我最近做了类似的事:http://bazaar.launchpad.net/~luke-campagnola/pyqtgraph/dev/view/head:/widgets/RemoteGraphicsView.py。有关如何从共享内存重建QImage的信息,请参阅'remoteSceneChanged'方法。

相关问题