QT中的多线程

目录

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);
    }
}

Qt实现多线程数据收发的方法如下: 首先,在头文件"datareceiver.h"定义了一个名为DataReceiver的类,继承自QThread类。该类包含了一个静态的数据池DataPool,用于存储接收到的数据。同时,该类还定义了一个单例模式的getInstance()函数,用于获取DataReceiver的实例。在构造函数,可以传入一个QObject类型的父对象。还有一个stop()函数,用于停止线程的执行。在run()函数,通过循环判断数据池是否为空,如果不为空,则取出第一个数据并发出信号oneDataReady()。 在源文件"datareceiver.cpp",首先定义了一个静态的QStringList类型的数据池list,并初始化为空列表。然后使用Q_GLOBAL_STATIC宏定义了一个名为s_DataReceiver的全局静态变量,类型为DataReceiver,用于保存DataReceiver的实例。在getInstance()函数,返回s_DataReceiver的值。在构造函数,将父对象传递给QThread的构造函数。stop()函数,调用requestInterruption()函数请求线程断。在run()函数,通过互斥锁mutex保证线程安全,判断数据池是否为空,如果不为空,则取出第一个数据并发出信号oneDataReady()。最后,通过调用msleep()函数短暂睡眠,让出线程。 使用该类的方法是,首先获取DataReceiver的实例,然后调用start()函数启动线程。在接收到数据后,将数据添加到数据池。可以通过连接信号oneDataReady()来处理接收到的数据。 以上是在Qt实现多线程数据收发的简要介绍。\[1\]\[3\] #### 引用[.reference_title] - *1* *3* [一种基于Qt多线程的数据接收方案](https://blog.csdn.net/iriczhao/article/details/121503545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Qt工作笔记-UDP多线程数据处理及发送(简单实例)](https://blog.csdn.net/weixin_39786534/article/details/111545637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

small建攻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值