Qt编程技巧总结篇(4)-信号-槽-多线程(三)

Qt编程技巧总结篇(4)-信号-槽-多线程(三)

  多线程学习,使用QWaitCondition提供线程同步方法,QWaitConditionQMutex进行搭配,实现一个线程在满足一定条件时通知其他多个线程。OK,开整~

多线程与线程同步

多线程:定义多个子线程类,在一个主线程中进行多个子线程任务。
线程同步:主线程在串行运行过程中,多个子线程同步进行,灵活分配资源运作。(自己的一点理解)

QWaitCondition提供的函数

  • wait(QMutex *lockedMutex) 解锁互斥量 lockedMutex ,并阻塞等待唤醒条件,被唤醒后,锁定 lockedMutex 并退出函数;
  • wakeAll() 唤醒所有处于等待状态的线程,线程唤醒的顺序不确定;
  • wakeOne() 唤醒一个处于等待状态的线程,唤醒哪一个不确定。

实例与应用

下面的例子是《 QT5.9 c++ 开发指南》中的例子,代码放这里,欢迎参考学习!

定义 数据类型

QMutex  mutex;
QWaitCondition  newdataAvailable;

int     seq=0;//序号
int     diceValue;

QThreadProducer子线程的run()函数重写,

void QThreadProducer::run()
{
	m_stop-false;//启动线程时令m_stop-false
	seq=0;
	qsrand(QTime::currentTime().msec());//随机数初始化,gsrand是线程安全的
	while(!m_stop)//循环主体
	{
		mutex.lock();
		diceValue=qrand();//获取随机数
		diceValue=(diceValue%6)+1;
		seq++;
		mutex.unlock();
		
		newdataAvailable,wakeAll();//唤醒所有线程,有新数据了
		msleep(500);/线程休眠100ms
	}
}


QThreadConsumer:子线程的run()函数重写,

void QThreadConsumer::run()
{
    m_stop=false;//启动线程时令m_stop=false
    while(!m_stop)//循环主体
    {
        mutex.lock();
        newdataAvailable.wait(&mutex);//会先解锁mutex,使其他线程可以使用mutex
        emit newValue(seq,diceValue);
        mutex.unlock();
    }

}


小结

  多线程的学习挺吃力地,主要是看代码不难,但是自己具体写起代码时,又是另一番场景,很多细节容易被遗忘,而且这玩意确实 “抽象” 啊!不过,加油,共勉。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值