//my_class.h
void My_class::My_Class(){
my_ip=...
my_port=...
};
void Data_Send_Func(){
// send data over tcp;
}
void My_Class::~My_Class(){
cout<<"Delete objects"<<endl;
}
void My_Class::process(){
QTimer my_timer;
my_timer->setInterval(30);
connect(my_timer,SIGNAL(timeout()),this,SLOT(Data_Send_Func()));
connect(this,SIGNAL(destroyed()),mytimer,SLOT(deleteLater));
}
//my_application.cpp
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())) ;
}
//my_application.h
struct Exit_App{
Exit_App(){
signal(SIGINT,&Exit_App::Exit_F);
signal(SIGTERM,&Exit_App::Exit_F);
signal(SIGBREAK,&Exit_App::Exit_F);
}
static void Exit_F(int sig){
cout<<"Exiting App"<<endl;
QCoreApplication::exit(0);
}
}
int main(argc,char* argv[]){
Exit_App app;
My_application a(arcg,argv);
return a.exec();
}
Поэтому, когда я закрываю свою программу, я хочу удалить объекты в деструкторе My_Class.
Я не хочу излучать финишный сигнал в приложении, поэтому я хочу удалить объект my_class и поток в My_application destructor.
My_application::~My_application{
if (my_class->thread()) {
connect(my_class, SIGNAL(destroyed()), thread, SLOT(quit());
my_class->deleteLater();
} else {
delete my_class; // It a threadless object, we can delete it
thread->quit();
}
thread->wait();
}
Объект QObject
не может быть удален из любого потока, кроме него, если он меньше, чем поток (из-за завершения его потока). Необходимо:
Q_ASSERT(!object->thread() || object->thread() == QThread::currentThread());
delete object;
В случае объекта, у которого есть поток, вам нужно вызвать метод deleteLater
объекта. Удаление будет выполняться в цикле событий потока. Когда объект удаляется, время заканчивается. Так:
if (my_class->thread()) {
connect(my_class, SIGNAL(destroyed()), thread, SLOT(quit());
my_class->deleteLater();
} else {
delete my_class; // It a threadless object, we can delete it
thread->quit();
}
thread->wait();
Обратите внимание, что это нормально, чтобы вызвать quit()
и wait()
в потоке, который завершен. Недостаточно проверять, работает ли поток, как вы.