需要注意的是,同步不是同时,而是有序进行。
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开发知识请查看下面的相关链接










