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

猜你喜欢

转载自blog.csdn.net/qq_54395977/article/details/122725537
今日推荐