使用不带new的QThread
Using a QThread without new
下面是一些示例代码。
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
的开销可以忽略不计,不应该引起关注。
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 如何监控QThread
- 重载运算符new[]的行为取决于析构函数
- 过载'operator new'如何导致无限循环?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- Codelite C++ new project
- 在类c++中使用new声明数组
- g++用户定义的动态链接库上的全局new和delete运算符
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 在将 new 与指针一起使用时,创建数组的指定长度
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 为什么我的全局 new() 覆盖被绕过了?
- 声明C++数组(带或不带 "new" 关键字)
- 在C++中,如果我可以直接将整数分配给指针而不使用"new",为什么要使用"new"?
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- constexpr new 如何分配内存?
- 放置 new 和 uninitialized_fill() 的行为
- 使用不带new的QThread