首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Qt中使用finished退出线程并进行clean_up的正确方法

在Qt中使用finished退出线程并进行clean_up的正确方法
EN

Stack Overflow用户
提问于 2014-04-24 20:01:58
回答 2查看 3.1K关注 0票数 2

我有一个有很多线程的应用程序,当我关闭我的主应用程序并调用线程析构函数进行必要的清理时,我想退出这些线程。

代码语言:javascript
复制
 Class Thread :public QThread{

 Thread(); 

  run(){

     while(1){

       //do work 
     } 

  }

 ~Thread(){

  //want to make clean up

     }
 }; 


 Class my_app :public QCoreapplication{

 my_app(){

 Thread th1;

 connect(&th1,SIGNAL(finished()),&th1,deleteLater());
 connect(&th1,SIGNAL(finished()),&th1,quit());


 }

 };




 //And my th1 thread runs in while.So I know that is the problem it runs on while and never emits the finished signal

 //How can be achievable?
EN

回答 2

Stack Overflow用户

发布于 2014-04-24 20:46:43

  1. Do not subclass QThread
  2. in worker循环提供了一些线程安全标志,用于指示worker应该结束其作业。
  3. 在终止应用程序之前,您应该调用QThread::wait以确保线程在应用程序终止之前正常结束。
票数 1
EN

Stack Overflow用户

发布于 2014-04-24 21:36:39

在run函数中,while循环将导致线程永远不会停止,除非您自己管理线程终止,如:

代码语言:javascript
复制
Class Thread :public QThread{

Thread(); 

protected:

   void run()
   {

      while(1)
      {
          if(this->finishThread==true)
              return;
      } 

   }

private:

  bool finishThread;
}

您最好从QObject派生类并使用moveToThread。您可以在类的构造函数中执行此操作:

代码语言:javascript
复制
th = new QThread();

this->setParent(0);
this->moveToThread(th);
clientSocket.moveToThread(th);

QObject::connect(th,SIGNAL(started()),this,SLOT(OnStarted()));
QObject::connect(th,SIGNAL(finished()),this,SLOT(OnFinished()));

th->start();

初始化和终止任务应该分别在OnStarted()和OnFinished()插槽中完成。

在类的析构函数中添加以下内容:

代码语言:javascript
复制
th->quit();
th->wait();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23268331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档