使用不带new的QThread

Using a QThread without new

本文关键字:QThread new      更新时间:2023-10-16

下面是一些示例代码。

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。如果这是唯一的上下文使用它,我不能只是使用"qthreadworkerthread",引用其地址进行连接,并完成?这将使程序避免将线程放在堆上。我注意到,如果我不使用new并使用我列出的方式,我得到以下错误"QThread:在线程仍在运行时销毁"。除了我列出的更改外,代码中没有任何更改。如果我用new,我不会得到这个错误。有显著差异吗?

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

如果把东西放在堆上,Qt做得更好。

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

文档接着展示了如果它只放在堆栈上,它是如何失败的。

希望对你有帮助。

老实说,没有多少情况下,你可以把一个QThread放在堆栈上,并在函数返回(和线程销毁)之前对它做一些有用的事情。也许如果你阻塞主线程并等待额外的线程,但是……在某种程度上违背了使用额外线程的目的。如果你要阻塞主线程来等待额外的线程,你最好在主线程中完成工作。

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

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