【问题标题】:QObject.moveToThread(thread) if thread is a child of that objectQObject.moveToThread(thread) 如果线程是该对象的子对象
【发布时间】:2012-04-30 14:15:28
【问题描述】:

我想以子 QThread (thread) 创建 QObject (object),并将该 object 作为父对象(对于在 object 存活时保持 thread 存活)并生成 object.moveToThread(thread) 但在这种情况下启动 thread 的信号不起作用。 p>

简单地说:

  1. 对象拥有线程
  2. object 移动到 thread
  3. 信号启动线程不工作

发生了什么事?

【问题讨论】:

  • 你能显示connect()语句吗?另外,你有没有试过它是否返回true?
  • @Tim Meyer,“另外,你试过它是否返回 true 吗?” 是的,它返回 true。如果我将其他 QObject 设置为线程的父级 - 没关系,一切正常。
  • @Tim Meyer,我创建了从 object 发出 started() 信号的函数 (object.start()),并且我还连接了 object 的 @ 987654327@ 向线程start() 槽发送信号。我通过调用object.start() 函数开始线程。在所有情况下都可以发出object.started() 信号,但thread 仅在他是另一个 QObject 的孩子时才开始。

标签: qt qt4 pyqt qthread qobject


【解决方案1】:

[编辑]:由于 cmets 丢弃了我最初的答案

也许像下面这样:

  1. 创建对象
  2. 创建线程,但不要为其分配父级
  3. 像往常一样将 Thread 的 finished() 信号连接到它的 deleteLater() 槽
  4. 将 Object 的 deleted() 信号连接到线程的 stop() 槽

然后,当你删除对象时,它会发出 deleted() 来停止线程。线程将发出finished(),它会调用它的deleteLater() 槽。

【讨论】:

  • @Tym Meyer, "TestObject 拥有线程" - 我不懂 C++,无法检查此代码,但我了解您上面代码的某些部分。也许我错了,但是当我们创建必须由某个 Obj 拥有的线程时,我们创建 QThread(parent = Obj) 然后线程归 Obj 所有。或者如果我们直接调用 thread.setParent(Obj) - 也是一样的。在您的情况下,对象不拥有线程,而是将线程作为其自身的参数。我已经考虑过了,我不需要这种行为。
  • 哦,我忽略了你的 pyqt 标签,抱歉。实际上,当我设置父级时,它不再起作用。在 Qt for C++ 中,每个 QObject 都可能有一个父级,但它不是必须的。这对 PyQt 有什么不同吗?
  • 不,这没有意义。但是我需要将父级设置为保持QObject 作为具有酷接口th = container.findChild(QThread, name = "awesom_thread_56") 的线程的容器,当我调用thread.setParent(0) 时,线程可能会通过析构函数自动从容器中删除。或者,如果我只是删除线程 - 它会从父 QObject 的孩子中删除。如果没有对线程的引用,那么它将被完全删除。将线程的finished() 信号与线程的deleteLater 槽连接起来对于内存管理也很有用。那么层次对象的魔法就会发生
  • 只有将QThread子类化并从线程访问对象才会有问题
  • 是的,你不能启动一个线程,它是它使用的对象的子线程。如果有的话,对象应该是线程的子对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 2020-04-16
  • 1970-01-01
相关资源
最近更新 更多