Qt5多线程/线程池技术集锦(2)

简介: Qt5多线程/线程池技术集锦

3.5 线程池基本用法


#include <QCoreApplication>
#include <QDebug>
#include <QRunnable>
#include <QThread>
#include <QThreadPool>
class MyRun : public QRunnable
{
public:
    MyRun()
    {
    }
    ~MyRun()
    {
    }
public:
    void run()
    {
        int i = 3;
        while (i)
        {
            i--;
            qDebug() << "thread start:" << QThread::currentThreadId();
            QThread::msleep(500);
        }
    }
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "Main:" << QThread::currentThreadId();
    QThreadPool m;
    m.setMaxThreadCount(2);
    m.setExpiryTimeout(-1);
    MyRun *run = new MyRun;
    if (!run->autoDelete())
    {
        qDebug() << "QRunnable's autoDelete default value is not true";
        run->setAutoDelete(true);
    }
    qDebug() << m.maxThreadCount() << m.expiryTimeout();
    qDebug() << m.activeThreadCount();
    m.start(run);
    qDebug() << m.activeThreadCount();
    m.waitForDone();
    qDebug() << m.activeThreadCount();
    return 0;
}

3.6 线程池内的子线程发信号


需要派生QObject!


class MyThread_draw2D_SectionChart : public QObject, public QRunnable
{
  Q_OBJECT
public:
  MyThread_draw2D_SectionChart(int frameNo) :
  m_iFrameNo(frameNo)
  {
  }
  virtual ~MyThread_draw2D_SectionChart()
  {
  qDebug() << "~MyThread";
  }
public:
  virtual void run();
private:
  int m_iFrameNo;
signals:
  void sig_updateUI_SectionChart(int frameNo);
};


4、子线程发信号给主线程,更新UI


通过信号槽的机制可以实现,子线程发信号给主线程即可。不会阻塞。


启动线程

m_future_2d_SectionChart = QtConcurrent::run(this, &FormContent::thread_draw2D_SectionChart);

子线程

void FormContent::thread_draw2D_SectionChart(void)//绘制2D截面图

{

qDebug() << "sub thread id:" << QThread::currentThreadId();

connect(this, SIGNAL(sig_updateUI_SectionChart()), this, SLOT(slot_updateUI_SectionChart()));

while (true)

{

//去主线程更新UI

 emit sig_updateUI_SectionChart();

}

}

主线程

void FormContent::slot_updateUI_SectionChart(void)//更新2D截面图

{

  qDebug() << "main thread id:" << QThread::currentThreadId();

m_pFormTimeline->updateSectionChart();

}


5、数据保护,加锁解锁


QMutex 提供相互排斥的锁,或互斥量;有递归和非递归之分;

QMutexLocker 是一个辅助类,自动对 QMutex 加锁与解锁;

QReadWriterLock 提供了一个可以同时读操作的锁;有递归和非递归之分;

QReadLocker与QWriteLocker 自动对QReadWriteLock 加锁与解锁;

QSemaphore 提供了一个整型信号量,是互斥量的泛化;

QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。


https://doc.qt.io/qt-5/qmutex.html


https://doc.qt.io/qt-5/qmutexlocker.html


https://doc.qt.io/qt-5/qreadlocker.html


https://doc.qt.io/qt-5/qwritelocker.html


https://doc.qt.io/qt-5/qreadwritelock.html


https://doc.qt.io/qt-5/qsemaphore.html


https://blog.csdn.net/guoyufeng25/article/details/103105244



6、线程优先级


Qthread的优先级属性:Priority指示系统如何调度线程。


QThread::IdlePriority 0


scheduled only when no other threads are running.


QThread::LowestPriority 1


scheduled less often than LowPriority.


QThread::LowPriority 2


scheduled less often than NormalPriority.


QThread::NormalPriority 3


the default priority of the operating system.


QThread::HighPriority 4


scheduled more often than NormalPriority.


QThread::HighestPriority 5


scheduled more often than HighPriority.


QThread::TimeCriticalPriority 6


scheduled as often as possible.


QThread::InheritPriority 7


use the same priority as the creating thread. This is the default.



x、多线程的高级应用


TCP Client/TCP Server


https://sourceforge.net/projects/threader-qt/


https://sourceforge.net/p/threader-qt/svn/HEAD/tree/


future/promise【推荐】


https://github.com/mhogomchungu/tasks


y、参考文献


https://github.com/czyt1988/czyBlog/tree/master/tech/QtThread


https://www.cnblogs.com/xia-weiwen/p/10306089.html


https://github.com/Xia-Weiwen/CopyFile


相关文章
|
6天前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
21 3
|
3天前
|
Java
线程池和线程详细教程
线程池和线程详细教程
|
5天前
|
监控 Java 调度
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
Java面试题:描述Java线程池的概念、用途及常见的线程池类型。介绍一下Java中的线程池有哪些优缺点
18 1
|
5天前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
15 1
|
5天前
|
设计模式 安全 Java
Java面试题:请解释Java中的线程池以及为什么要使用线程池?请解释Java中的内存模型以及如何避免内存泄漏?请解释Java中的并发工具包以及如何实现一个简单的线程安全队列?
Java面试题:请解释Java中的线程池以及为什么要使用线程池?请解释Java中的内存模型以及如何避免内存泄漏?请解释Java中的并发工具包以及如何实现一个简单的线程安全队列?
10 1
|
5天前
|
设计模式 缓存 安全
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
Java面试题:工厂模式与内存泄漏防范?线程安全与volatile关键字的适用性?并发集合与线程池管理问题
12 1
|
10天前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
|
11天前
|
并行计算 Java 大数据
Java中的高效并行计算与多线程编程技术
Java中的高效并行计算与多线程编程技术
|
5天前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
10 0
|
5天前
|
安全 算法 Java
Java面试题:如何诊断和解决Java应用程序中的内存泄漏问题?如何实现一个线程安全的计数器?如何合理配置线程池以应对不同的业务场景?
Java面试题:如何诊断和解决Java应用程序中的内存泄漏问题?如何实现一个线程安全的计数器?如何合理配置线程池以应对不同的业务场景?
7 0