从线程启动函数。(GUI线程和QThread错误)

2024-05-23 17:53:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用Python的线程模块做了一个例程来运行一个子进程并等待它完成。 我用下面的线来穿线:

t1=Thread(target=self.routineFunction, args=(self, "file1.txt", "file2.txt", self.nextFunction)).start()

在我的函数routineFunction(self,file1,file2,nextFunction)中,我调用下一个函数,在子进程运行完毕后运行。在

在那之前一切正常。在

但是,如果我在下一个函数中创建新的QObject项,就会收到很多错误: -“QPixmap:在GUI线程之外使用pixmap是不安全的” -“QObject::startTimer:QTimer只能用于以QThread开头的线程”

我的猜测是,当我从例程调用nextFunction时,它与例程在同一线程中运行,因此会出现错误。 有没有办法从“main”或“normal”线程内的例程调用函数?。在

谢谢你的帮助。在


Tags: 模块函数selftxt进程错误线程例程
2条回答

好的,所以我认为我们的解决方案是可能的。不幸的是,我发现很难将我当前的脚本从Thread转换成QThread(我一般不熟悉线程)。在

我找到了一个解决办法: 我传递了一个queue=排队。排队()我用队列.put(True)如果我的新线程中的子进程成功。没有更多的nextFunction,我只是用队列.get(). 通过这样做,我可以在GUI线程中继续。在

一般来说,从其他线程调用函数是可以的。但是许多GUI库(QT就是其中之一)对这种行为有一些限制。在

例如,有一个名为“GUI线程”的指定线程,它处理所有图形化的东西,如从操作系统发送消息、重新绘制窗口等,而且您也只能使用这个线程来处理GUI。因此,例如,您不应该在其他线程中创建QPixmap。在

QTimer使用一些QThread的内部数据,因此您应该在仅以QThread开头的线程中使用这样的计时器,而不能使用普通Pythonthread模块。在

回到您的问题,如果您不想使用QT,您应该使用QThread生成线程,并使用postEvent()方法将事件发布到GUI线程。这将保证QT内部数据结构的一致性。在

因此,您可以在任何QT线程中运行代码,但是如果您想使用GUI(您的QObject使用QPixmap,所以就是这样),您只需要在GUI线程中处理这样的调用。在

相关问题 更多 >