1

所以我在下面有一些示例代码。

workerThread = new QThread();
m_worker->moveToThread( workerThread );
connect( workerThread , SIGNAL( started() ), m_worker, SLOT( createObject() ) );
connect( m_worker, SIGNAL( created() ), this, SLOT( objectReceived() ) );
workerThread->start();

它目前通过用 new 初始化 QThread 来使用它。如果这是它使用的唯一上下文,我不能只使用“QThread workerThread”,引用它的地址进行连接,然后就完成了吗?这将使程序免于将线程放在堆上。我注意到如果我不使用 new 并使用我列出的方式,我会收到以下错误“QThread: Destroyed while thread is still running”。除了我列出的更改之外,代码中没有任何更改。如果我使用 new 我不会收到此错误。有显着差异吗?

4

2 回答 2

1

http://qt-project.org/doc/qt-4.8/objecttrees.html

如果将东西放在堆上,Qt 确实可以更好地清理和更好地进行育儿。

当 QObjects 在堆上创建(即用 new 创建)时,可以以任何顺序从它们构造一棵树,然后,可以以任何顺序销毁树中的对象。当树中的任何 QObject 被删除时,如果该对象有父对象,则析构函数会自动从其父对象中删除该对象。如果对象有子对象,析构函数会自动删除每个子对象。没有 QObject 被删除两次,无论销毁顺序如何。

然后,文档继续说明如果仅将其放在堆栈上,它会如何失败。

希望有帮助。

于 2013-04-15T01:26:21.653 回答
0

QThread老实说,在函数返回(并且线程被销毁)之前,您可以将 a 放在堆栈上并使用它做一些有用的事情的情况并不多。也许如果你阻塞主线程并等待额外的线程,但这......不知何故违背了使用额外线程的目的。如果你要阻塞主线程等待额外的线程,你还不如在主线程中完成工作。

这可能适用的另一种情况是,如果您将QThread用作类成员而不是QThread *- 在这种情况下它会起作用,但是您会失去对线程生命周期的控制,这可能并不理想。如果你有一个更静态的使用场景 - 你可以这样做并为自己节省动态内存分配的可怕开销......

无论如何,QThread动态分配单个的开销可以忽略不计,不应引起关注。

于 2013-04-15T01:52:05.703 回答