Как удалить объекты и экземпляры потоков в деструкторе QCoreApplication

0
  //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();

 }
  • 0
    Что именно не работает? Сбой программы, или она выводит какое-то сообщение об ошибке во время выполнения деструктора, или она ведет себя неправильно каким-то другим образом?
  • 0
    @Frank Я поместил некоторый код отладки в запись и завершил работу с деструктором. Строка отладки ввода печатается, но выход никогда не выполняется
Показать ещё 5 комментариев
Теги:
multithreading
qt

1 ответ

2

Объект 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() в потоке, который завершен. Недостаточно проверять, работает ли поток, как вы.

  • 0
    .Я попробовал, но id не входит в деструктор my_class

Ещё вопросы

Сообщество Overcoder
Наверх
Меню