Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1903|回复: 0
打印 上一主题 下一主题

基于Qt的线程安全退出

[复制链接]

1228

主题

1997

帖子

7582

积分

认证用户组

Rank: 5Rank: 5

积分
7582
跳转到指定楼层
楼主
发表于 2020-12-3 17:49:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://blog.csdn.net/z1houcheng12/article/details/80595166

首先,QThread的用法有两种:

(1)继承自QThread类:

  1. #ifndef CHILDTHREADA_H
  2. #define CHILDTHREADA_H
  3. #include <QThread>
  4. #include <QMutex>
  5. class ChildThreadA : public QThread
  6. {
  7.     Q_OBJECT
  8. public:
  9.     explicit ChildThreadA(QWidget *parent = 0);
  10.     ~ChildThreadA();
  11.     void exitThread();
  12. protected:
  13.     void run();
  14. private:
  15.     bool m_isExist;//控制线程退出
  16.     QMutex m_mutex;
  17. };
  18. #endif // CHILDTHREADA_H

  19. #include "ChildThreadA.h"
  20. ChildThreadA::ChildThreadA(QWidget *parent) :
  21.     QThread(parent),
  22.     m_isExist(false)
  23. {
  24. }
  25. ChildThreadA::~ChildThreadA()
  26. {
  27.     delete ui;
  28. }
  29. void ChildThreadA::exitThread()
  30. {
  31.     m_mutex.lock();
  32.     m_isExist = true;
  33.     m_mutex.unlock();
  34. }
  35. void ChildThreadA::run()
  36. {
  37.     while (1)
  38.     {
  39.         m_mutex.lock();
  40.         if(m_isExist)
  41.         {
  42.             break;
  43.         }
  44.         m_mutex.unlock();
  45.         //do something
  46.     }
  47.     m_mutex.unlock();
  48. }
复制代码
在自定义的线程类中通过使用m_isExist变量控制线程的退出。在外部调用退出线程时应该这样:

  1.   childThread->exitThread();
  2.   if (childThread->wait())
  3.   {            
  4.     //m_capPicThread->terminate();
  5.   }
复制代码

首先调用退出线程接口,重置标识符的值;程序会阻塞再wait()处直到while循环退出,关于terminate()这行代码要不要都可以,因为可以执行到此,whllie循环肯定已经退出。

(2)自定义QObject类型,moveToThread():

#ifndef MYOBJECT_H#define MYOBJECT_H#include <QObject>class MyObject : public QObject{    Q_OBJECTpublic:    explicit MyObject(QObject *parent = 0);signals:public slots:};#endif // MYOBJECT_H#include "MyObject.h"MyObject::MyObject(QObject *parent) : QObject(parent){    }

MyObject *object = new MyObject;

QThread *thread = new QThread;

object->moveToThread(thread);

这种做法在线程退出时,因为子线程的运行是在槽函数中进行的,所以首先应该断开槽函数的连接


disconnect();然后使用

        thread ->quit();

        thread ->wait();使线程正常退出。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-5-2 20:59 , Processed in 0.056311 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表