我已经用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”线程内的例程调用函数?。在
谢谢你的帮助。在
好的,所以我认为我们的解决方案是可能的。不幸的是,我发现很难将我当前的脚本从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线程中处理这样的调用。在相关问题 更多 >
编程相关推荐