21,472
社区成员
发帖
与我相关
我的任务
分享
ClassA::ClassA(QObject *parent) : QObject(parent)
{
ti = new QTimer(this);
ti->setInterval(1000);
connect(ti, SIGNAL(timeout()), this, SLOT(onTimeut()));
ti->start();
}
ClassA *a = new ClassA();
QThread *th = new QThread();
a->movetoThread(th);
th->start();
th->quit();
th->wait();
th->deletelater();
delete a;

经过反复的测试,我发现这样居然是唯一解?必须要信号槽,不能手动quit wait delete。主要几个关键点:
对于ClassA这个类来说,关键在于构造的时候new QTimer是传了个parent指定了ClassA,那么别人把ClassA移到新线程时候,timer会跟着一起到新的线程里面。那么在delete时候,delete执行的那个线程,不用信号槽,大概率是在主线程去删除,那么这个时候,timer->thread()和currentThread()就不是同一个线程,就会报错。如果先把子线程quit wait delete掉,那么timer和ClassA的thread()就是NULL,一样报错。
那么能不能在删除子线程后,把ClassA再拖回主线程呢?很可惜,QT说明文档写明了,moveToThread只能把Obj“推出去”,不能“拉回来”。那么能不能子线程先来一套quit() wait() deletelater(),然后再ClassA->deletelater()呢,也不行,因为ClassA的thread()已经是空了,deletelater实际上是postEvent的,也就是说ClassA是不会处理这个事件的。你们可以试一下,析构函数并不会被调用,而且这是灾难的。