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

}


小结

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

相关推荐

  1. Qt编程技巧总结4)-信号--线

    2024-07-17 10:34:01       24 阅读
  2. Qt编程技巧总结(5)-信号--线(四)

    2024-07-17 10:34:01       21 阅读
  3. 力学笃行(四)Qt 线信号

    2024-07-17 10:34:01       22 阅读
  4. Qt/QML编程学习之心得:信号+(十

    2024-07-17 10:34:01       49 阅读
  5. Qt线编程(QThread)

    2024-07-17 10:34:01       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-17 10:34:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 10:34:01       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 10:34:01       58 阅读
  4. Python语言-面向对象

    2024-07-17 10:34:01       69 阅读

热门阅读

  1. 【面试题】Golang之互斥锁与读写锁(第七篇)

    2024-07-17 10:34:01       22 阅读
  2. windows 安装 tensorflow 报错说 C++

    2024-07-17 10:34:01       23 阅读
  3. Vue 和 React 框架实现滚动缓冲区

    2024-07-17 10:34:01       21 阅读
  4. Mysql什么情况下会发生死锁,又该怎么解决?

    2024-07-17 10:34:01       25 阅读
  5. 服务器上有多个nginx,如何知道启动的是哪个?

    2024-07-17 10:34:01       25 阅读
  6. 3,SSH 服务器

    2024-07-17 10:34:01       28 阅读
  7. 外科营养支持病人的护理

    2024-07-17 10:34:01       24 阅读
  8. Netty UDP

    2024-07-17 10:34:01       19 阅读