ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QT中的多线程

2022-01-28 21:02:42  阅读:163  来源: 互联网

标签:run QT 1.2 void 线程 多线程 QThread 函数


目录

1、QThread介绍

1.2、继承Qthread类

1.2.1、得到线程id

1.2.2、让线程一直执行

1.2.3、线程退出

1.2.4、​​​​​​​connect的第五个参数

1.2.5、线程锁 QMutex


​​​​​​​

1、QThread介绍

QThread类提供了一个与平台无关的管理线程的方法。一个QThread对象管理一个线程。QThread的执行从run()函数的执行开始,在Qt自带的QThread类中,run()函数通过调用exec()函数来启动事件循环机制,并且在线程内部处理Qt的事件。在Qt中建立线程的主要目的就是为了用线程来处理那些耗时的后台操作,从而让主界面能及时响应用户的请求操作。

QThread的使用方法有如下两种:

①、QObject::moveToThread()

②、继承QThread类

下面讲解第二种方法

1.2、继承Qthread类

先添加一个C++的文件

要添加下列句子才能支持信号与槽

//定义虚函数run()用来执行线程
protected:
    virtual void fun();

//定义函数设置名字
private:
    QString threadName; 
public:
    void setThreadName(QString);

void MyThread::setThreadName(QString name)
{
    threadName = name;
}

//实现run函数
void MyThread::run()
{
    qDebug()<<"MyThread::run:"<<QThread::currentThreadId(); 
    while(1)
    {
        qDebug() << threadName << "I'am A thread"; 
        QThread::sleep(1);
    }
}

//执行线程
MyThread thread1; 
thread1.setThreadName("thread1"); 
thread1.start();

MyThread thread1; 
thread1.setThreadName("thread2"); 
thread1.start();

 对上面的参数进行介绍:

1.2.1、得到线程id

//在之前实现的每一个函数函数中都加上输出,这样就能直到执行这个函数的线程id了
qDebug()<<"函数的名字"<<QThread::currentThreadId();

1.2.2、让线程一直执行

run情况下,就在里面加上一个while(1)一直执行
里面加一个sleep(),让他不要一直占cpu

​​​​​​​1.2.3、线程退出

exit()//退出
wait(1000)	//	等一秒,然后退出

1.2.4、​​​​​​​connect的第五个参数

 这个参数在线程中才用的到,表示线程的一个连接方式

 一般的话,就是自动连接,也就是第五个参,不用填。

1.2.5、线程锁 QMutex

        用线程还是会遇到访问共同资源的问题,如果遇到还是需要锁

        QMutex类提供了一种保护一个变量或者一段代码的方法,这样可以每次只让一个线程访问它。这个  类提供了一个lock()函数用于锁住互斥量,如果互斥量是解锁状态,那么当前线程立即占用并锁定它;否则,当前线程会阻塞,直到这个互斥量的线程对它解锁为止。QMutex类还提供了一个tryLock()函数, 如果该互斥量已经锁定,它就会立即返回。

void MyThread::run()
{
    qDebug()<<"MyThread::run"<<QThread::currentThreadId(); 
    while(1)//用while会让他一直跑
    {
        mutex.lock(); 
        x++;
        qDebug()<<threadName<<x<<QThread::currentThreadId();
        mutex.unlock(); 
        QThread::sleep(1);
    }
}

标签:run,QT,1.2,void,线程,多线程,QThread,函数
来源: https://blog.csdn.net/qq_54395977/article/details/122725537

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有