我做过这样的事情:
//in the mainwindow's constructor
QThread *thr = new QThread;
soundWorker * work = new soundWorker;
connect(this,SIGNAL(playsound()),work,SLOT(process()));
work->moveToThread(thr);
thr->start();
我应该删除thr并在mainwindow的解构器中工作吗?
答案 0 :(得分:5)
您可以通过将父级分配给QThread
来使用默认的Qt管理内存方式,即执行此操作:
QThread *thr = new QThread(this);//the mainwindow's is now the thread parent
在Qt,父母负责管理孩子的记忆。因此,QThread
将在需要时自动删除。
然后,对于您的soundWorker
,您有几种不同的解决方案。如果它的生命周期与您的mainwindow
相同,当您询问是否应该在mainwindow
的析构函数中删除它时,您可以简单地将其设为非指针成员,并将其存储然后会自动处理持续时间。
父母的东西特定于Qt。通常,当您自己处理内存时,应该使用启用RAII的包装器(例如智能指针)。
答案 1 :(得分:2)
您可以使用QThread::finished()
信号来检测您希望释放QThread
指针的那一刻。使用移动到新线程的QObject
指针也可以完成同样的事情。
考虑到关闭主窗口的时刻是关闭整个应用程序的时刻,并且考虑到在应用程序关闭后您不需要进一步处理,您可以将主窗口指针作为父窗口传递通过将QThread
传递给构造函数或使用QObject::setParent
来获取QThread
。
释放QThread
处理的线程内部获取的资源必须单独处理,因为您无法使QThread
对象成为由其管理的资源的父级 - {{1}}生活在创建它的线程中,而不是它管理的线程中。
更多详情here。