【问题标题】:Qt - don't destroy thread after slot is finishedQt - 插槽完成后不要销毁线程
【发布时间】:2013-01-09 12:06:23
【问题描述】:

有没有办法防止在插槽内创建的线程在插槽完成后被销毁?

    <widget.cpp>

    ...
    void Widget::<slot_name>()
    {
        ...
        ThreadTask Watcher; //ThreadTask is defined in header file
        QThread WatcherThread;
        Watcher.moveToThread(&WatcherThread);
        QObject::connect ...
        WatcherThread.start();
        ...
    }

我知道我可以在插槽之外声明线程并仅从它开始,但问题是,如果再次触发相同的插槽,我想创建另一个线程。

【问题讨论】:

  • 您似乎不了解一些有关堆和堆栈分配的 C++ 基础知识。阅读一些好的 C++ 书籍,因为您至少需要 C++ 基础才能使用 Qt
  • 是的,我过去一直在编写大量脚本,最近才转向 OOP,但我一直在按顺序思考,就像在脚本中一样。

标签: qt qt4 qthread


【解决方案1】:

使用dynamic allocation

QThread* WatcherThread = new Qthread();

请注意,您必须在线程执行完成后将其删除,以避免内存泄漏。

如果您使用以下代码,Qt 可以在线程完成时自动删除:

connect(WatcherThread , SIGNAL(finished()),
    WatcherThread , SLOT(deleteLater()));

【讨论】:

  • 谢谢你,你太棒了,它工作得很好!我是 OOP 的新手。
  • 那么 ThreadTask 呢?它也应该在堆上分配
  • 你说得对,我认为对 ThreadTask 做同样的事情是显而易见的