【问题标题】:(PyQt5) is QThread an abstract class?(PyQt5) QThread 是一个抽象类吗?
【发布时间】:2020-09-25 18:32:21
【问题描述】:

显然,当我们在 pyqt 中使用 QThread 进行多线程时,我们将不得不继承 QThread 并且不能直接实例化它。这意味着 QThread 是一个抽象类。

这很好,但我不明白的是,当我们继承 QThread 时,我们只覆盖了 run() 方法,但是为了真正让这个多线程功能工作,我们必须调用QThread 子类的 start() 方法,我们根本没有重写(AFAIK,如果我们是抽象类的子类,我们将不得不重写它在我们的子类中具有的每个方法,否则它无法实例化)。

那么 start() 和 finish 方法从何而来?

【问题讨论】:

    标签: python multithreading pyqt qthread


    【解决方案1】:

    并非抽象类的每个方法本身都是抽象的。对于QThread,方法start()finish() 在所有子类中都具有相同的行为,因此它们有具体的实现供您使用,但没有run() 的基本实现(因为定义线程做什么)所以这是抽象的,需要自定义实现。

    【讨论】:

    • 为什么我们在run() 方法中编写我们的命令,但我们使用start() 来实际运行这些命令?我们不应该说instance.run()吗?
    • 不,因为QThread 的全部意义在于在自己的线程上运行该函数。如果您直接调用run(),那么您只是在当前线程中运行它,这违背了目的。
    • start() 的工作是启动一个新线程,然后在该线程上调用run()。这就是为什么start() 是具体的(它总是做同样的事情)而run() 是抽象的(它需要你告诉它要做什么)。
    • 那么我们可以说run() 包含在start() 中吗?
    • run() start() 调用的,是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2017-11-30
    • 2019-06-24
    • 2011-05-22
    • 2012-11-07
    相关资源
    最近更新 更多