2014-02-28 75 views
1

我在QThreads newbee和问题,我是可疑的删除对象时,程序finishes.My程序具有从Qobject派生的类:删除对象完成

class My_application: public QCoreApplication{ 
    .... 
    .... 
}; 

class My_Class: public QObject{ 
    ... 
    ... 
}; 

void My_Class::process{ 

    QTimer timer=new QTimer(); 
    timer->setInterval(time); 
    connect(timer,SIGNAL(timeout()),this,SLOT(dowork())); 
    timer->start(); 

} 

My_application::My_application:QCoreApplication{ 

    my_class=new My_Class(); 

    QThread thread=new QThread(); 

    my_class->moveToThread(thread); 

    connect(thread,SIGNAL(started()),my_class,SLOT(process())) ; 

    connect(my_class,SIGNAL(finished()),thread,SLOT(quit())) ; 

    connect(thread,SIGNAL(finished()),thread,SLOT(deletelater())) ; 

    connect(my_class,SIGNAL(finished()),my_class,SLOT(deletelater())) ;   


} 

    void My_Class::dowork(){ 

    //here doing the work with timer elapsed.Doing work with some buffer and send data 
    //    

    } 

如果我停止了我的程序我发现有些对象没有被正确删除,我的程序在重新启动时无法正常工作。事实上,我对Qt线程并不熟悉,我想知道什么时候My_Class的析构函数会被调用?我做错了什么?

+0

不确定,但你可以使用deleteLater()与你的线程connect(workerThread,SIGNAL(finished()),worker,SLOT(deleteLater()));并谨慎用deleteLater()作为参考。 http://stackoverflow.com/questions/9632989/qobjectdeletelater-across-a-qthread – Wagmare

+0

你的课程是否包含'完成'信号?你在哪里发射它? –

+0

呃,至少['QThread :: finished()'signal](https://qt-project.org/doc/qt-5.0/qtcore/qthread.html#finished)连接到'deleteLater()'是当他们的线程完成时删除对象的规范方法,所以你做对了,我会删除其他'deleteLater()'连接,以保持整洁。 – hyde

回答

0

你忘了控制自己的计时器的寿命(在My_Class::process):

connect(this, SIGNAL(destroyed()), timer, SLOT(deleteLater()));

QTimer timer=new QTimer(**this**);

您应该手动删除my_class=new My_Class();。它不会在线程的finished信号上被删除,因为没有事件循环来处理deleteLater插槽。

我很困惑,为什么你不想声明my_class作为My_application的成员?

+0

@dimitry你是对的我试图在循环中运行这些,所以我忘记调用emitFinished.SO还有另一个问题。如果我调用emit完成并清除对象。然后继续循环它是否正确运行第二次?我想清除对象并再次运行所有程序,因此我想关闭程序 – barp

+0

因此,当我关闭my_program时,希望我的应用程序发送finisded到线程和线程发送完成到my_class和my_class以销毁对象 – barp

+0

您的应用程序将发送'aboutToClose'。在这个信号上,你应该停止所有线程,等待真正的停止并销毁对象。没有必要使用伏都教信号和插槽来实现所有逻辑。 –