Qt基础开发之Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例

2020-03-16 12:01:40王旭

​需要注意的是,同步不是同时,而是有序进行。

3.1、互斥锁

​Qt中的互斥锁是QMutex,不继承任何Qt基类,使用QMutex来锁共享资源,哪个线程抢到钥匙,哪个线程就有这个资源的使用权,其它线程等待这个线程使用完资源并归还钥匙,然后它们再去抢钥匙。

​例如:

QMutex mutex; //这对象一般定义在多个线程能访问的地方
mutex.lock(); //多个线程调用这个函数去获取锁,没有获取到的线程,将阻塞等待在这个函数上。
mutex.unlock(); //释放锁

QMutex::lock函数会让线程等待获取锁,如果不想等待,可以使用一下函数替换:

bool QMutex::tryLock(int timeout = 0)
/*
*参数 int timeout:等到timeout毫秒,不管有没获取到锁都返回,timeout为0时,直接返回。
*返回值 true代表获取到锁,false没有获取到
*/

有时候我们会忘记释放锁,Qt还为我们提供了管理锁的类QMutexLocker

QMutex mutex;
void func()
{
 QMutexLocker locker(_mutex); //QMutexLocker最好实例化成栈对象,释放之前将QMutex解锁。 
}

以上例子,一旦func()执行完成locker自动释放,释放之前先解锁。

3.2、信号量

​互斥锁保护的资源同一时刻只能有一个线程能够获取使用权,有些资源是可以限定多个线程同时访问,那么这个时候可以使用信号量。在Qt中信号量为QSemaphore。

QSemaphore sem(2) //初始化信号量为2
sem.acquire(); //信号量部位0的时候,调用这个函数会让信号量-1,一旦信号量为零,阻塞等待
semaphore.release(); //使信号量+1

4、Qt定时器QTimer

​定时器可以隔一段时间发出信号,通过接收这个信号来处理一些定时任务,需要注意的是,定时器并没有开启一个新线程。Qt中的定时器是QTimer继承自QObject。

通过QTimer::start()来启动定时器

void start(int msec)
/*
*定时msec毫秒后,发射timeout()信号
*/

通过链接信号timeout()来处理一些定时任务,例如:

#include "dialog.h"
#include <QTimer>
#include <qdebug.h>
Dialog::Dialog(QWidget *parent)
 : QDialog(parent)
{
 QTimer *timer = new QTimer(this);
 connect(timer, SIGNAL(timeout()), this, SLOT(doSomeThing()));
 timer->start(3000);
 
}
void Dialog::doSomeThing()
{
 qDebug() << __FUNCTION__ << endl;
}
​
Dialog::~Dialog()
{
​
}

本文主要介绍了Qt多线程类QThread与Qt定时器类QTimer的详细方法与实例,更多关于Qt开发知识请查看下面的相关链接