繁体   English   中英

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

[英]Start a function from a thread. (GUI thread and QThread errors)

我已经使用Python的线程模块制作了例程,以运行一个子进程并等待其完成。 我用以下行进行线程处理:

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

在我的函数例程函数内部(自我,文件1,文件2,下一个函数),我在子进程完成运行后调用下一个要运行的函数。

在此之前,一切正常。

但是,如果我在下一个函数中创建新的QObject项目,则会收到很多错误:-“ QPixmap:在GUI线程外使用像素图并不安全”-“ QObject :: startTimer:QTimer仅可用于启动线程使用QThread”

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

谢谢您的帮助。

通常,可以从其他线程调用函数。 但是许多GUI库(其中包括QT)对此行为都有一些限制。

例如,有一个名为“ GUI线程”的指定线程,该线程处理所有图形化内容,例如从OS分发消息,重绘窗口等。并且,您还限制仅使用此线程来使用GUI。 因此,例如,您不应在其他线程中创建QPixmap

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

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

因此,您可以在任何QT线程中运行代码,但是如果要使用GUI(您的QObject使用QPixmap ,就是这种情况),则仅需要在GUI线程中处理此类调用。

好的,所以我认为可以采用解决方案。 不幸的是,我发现很难将我当前的脚本从Thread转换为QThread(一般来说,我是线程的新手)。

我找到了一种解决方法:我没有传递nextFunction作为参数,而是传递了queue = Queue.Queue(),并且如果我的新线程中的子进程成功,则使用queue.put(True)。 没有更多的nextFunction了,我只是使用queue.get()等待队列中的值。 通过这样做,我可以继续在GUI线程中进行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM