`

Qt多线程

    博客分类:
  • Qt
 
阅读更多
Qt中线程安全的类有QMutex,QMutexLocker,QReadWriteLock,QReadLocker,QWriteLocker,QSemaphore(信号量),QThreadStorage<T>,QWaitCondition

#include<iostream>
#include<QThread>
#include<QMutex>
#include<QWaitCondition>
using namespace std;

QMutex mutex;
QWaitCondition wait1;

class Thread1:public QThread{
public:
    void run(){
        mutex.lock();
        for(int i=0;i<5;i++){
            msleep(500);
            cout << "t1" << endl;
        }
        mutex.unlock();
        wait1.wakeOne();
    }
};

class Thread2:public QThread{
public:
    void run(){
        wait1.wait(&mutex);
        for(int i=0;i<5;i++){
            cout << "t2" << endl;
        }
    }
};

int main(){
    Thread1 t1;
    Thread2 t2;
    t1.start();
    t2.start();
    t1.wait();
    t2.wait();
}



结果是t1完全跑完后再跑t2:
t1
t1
t1
t1
t1
t2
t2
t2
t2
t2

也可以用QMutexLocker,这样是不是看起来更简单一点呢?
#include<iostream>
#include<QThread>
#include<QMutex>
#include<QMutexLocker>
using namespace std;

QMutex mutex;

class Thread1:public QThread{
public:
    void run(){
        QMutexLocker locker(&mutex);
        for(int i=0;i<5;i++){
            msleep(500);
            cout << "t1" << endl;
        }
    }
};

class Thread2:public QThread{
public:
    void run(){
        QMutexLocker locker(&mutex);
        for(int i=0;i<5;i++){
            cout << "t2" << endl;
        }
    }
};

int main(){
    Thread1 t1;
    Thread2 t2;
    t1.start();
    t2.start();
    t1.wait();
    t2.wait();
}

结果同上


read与write的略有不同,读锁大家都可以读,写锁则只能一个一个写
#include<QReadWriteLock>
#include<QFile>
#include<QThread>
#include<QTextStream>
#include<iostream>
#include<QTemporaryFile>
#include<QReadLocker>
using namespace std;

QReadWriteLock readWriteLocker;
const QString fileName = "test.txt";

void readFile(QFile& file){
    QTextStream ts(&file);
    QString str = ts.readAll();
    cout << str.toStdString() << endl;
}

class Read1:public QThread{
public:
    void run(){
        //加了读锁后,如果sleep,后面的可以不用等,直接读
        //但是如果这里是lockForWrite()的话,无论这里sleep多久,后面的线程都得等
        readWriteLocker.lockForRead();
        msleep(1000);
        QFile file(fileName);
        if(file.open(QIODevice::ReadWrite)){
            cout << "read1 start reading..." << endl;
            readFile(file);
        }
        readWriteLocker.unlock();
        file.close();//解锁后再关
    }
};

class Read2:public QThread{
public:
    void run(){
        readWriteLocker.lockForRead();
        QFile file(fileName);
        if(file.open(QIODevice::ReadWrite)){
            cout << "read2 start reading..." << endl;
            readFile(file);
        }else{
            cout << "can not open!" << endl;
        }
        readWriteLocker.unlock();
        file.close();
    }
};

int main(){
    Read1 r1;
    Read2 r2;
    r1.start();
    r2.start();
    r1.wait();
    r2.wait();
}

read2 start reading...
This is a test file!

read1 start reading...
This is a test file!




生产者与消费者
#include<iostream>  
#include<QThread>  
#include<stack>  
#include<QMutex>  
#include<QWaitCondition>  
using namespace std;  
  
stack<int> sk;  
const int sum = 10;  
const int maxSize = 3;  
QMutex mutex;  
QWaitCondition producerWait;  
QWaitCondition consumerWait;  
  
class Producer:public QThread{  
public:  
    void run(){  
        for(int i=1;i<=sum;i++){  
            if(sk.size()==maxSize){  
                cout << "stack is full,wait consumer!" << endl;  
                producerWait.wait(&mutex);  
            }  
            sk.push(i);  
            //mutex.lock();  
            msleep(180);  
            //mutex.unlock();  
            cout << "produce:" << i << endl;  
            consumerWait.wakeAll();  
        }  
    }  
};  
  
class Consumer:public QThread{  
public:  
    void run(){  
        int i = 0;  
        for(int j=1;j<=sum;j++){  
            if(sk.empty()){  
                cout << "stack is empty,wait producer!" << endl;  
                consumerWait.wait(&mutex);  
            }  
            i = sk.top();  
            sk.pop();  
            //mutex.lock();  
            msleep(300);  
            //mutex.unlock();  
            cout << "consume:" << i << endl;  
            producerWait.wakeAll();  
        }  
    }  
};  
  
int main(){  
    Consumer con;  
    Producer pro;  
    pro.start();  
    con.start();  
    con.wait();  
    pro.wait();  
}  


stack is empty,wait producer!
produce:1
produce:2
consume:2
produce:3
produce:4
consume:3
produce:5
consume:5
produce:6
produce:7
stack is full,wait consumer!
consume:6
produce:8
stack is full,wait consumer!
consume:7
produce:9
stack is full,wait consumer!
consume:8
produce:10
consume:9
consume:10
consume:4
consume:1
分享到:
评论

相关推荐

    Qt 多线程及简单实例 demo

    Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...

    qt多线程高效下载文件

    本项目"qt多线程高效下载文件"是基于Qt实现的一个实用工具,它利用多线程技术来提高文件下载的效率,特别是对于大文件或者需要同时下载多个文件的场景,这种多线程策略显得尤为重要。 在HTTP协议方面,它是互联网上...

    QT多线程实战源代码(QThread)

    QT多线程实战源代码(QThread)是一个关于如何在QT框架中利用多线程进行高效编程的示例集合。QT是一个跨平台的C++库,广泛用于开发GUI应用程序,而QThread是QT提供的一种线程管理机制,使得开发者可以在QT环境中方便...

    Qt多线程通讯

    在“Qt多线程通讯”DEMO中,主线程可能创建了一个`QThread`实例,并启动它。接着,一个工作对象(可能是自定义的QObject派生类)被移动到子线程中。这个工作对象可能会有一个接收参数的槽函数,用于处理主线程传递...

    qt 多线程实现样例,实现文件的拷贝

    本项目以"qt 多线程实现样例,实现文件的拷贝"为主题,通过使用 Qt 的 QThread 类来创建和管理后台线程,从而实现在后台执行文件拷贝任务,同时保持用户界面的流畅性。 Qt 中的多线程主要由 `QThread` 类提供支持,...

    Qt 多线程访问同一个变量

    在Qt框架中,多线程编程是常见的需求,特别是在处理密集型计算或异步操作时。标题"Qt 多线程访问同一个变量"涉及到的是如何在多线程环境下确保对共享资源(此处为一个全局变量)的安全访问。描述中提到了使用互斥锁...

    适合初学者的QT多线程操作的例子

    QT库是Qt公司开发的一款强大的跨平台应用程序开发框架,它提供了丰富的API用于创建GUI和非GUI应用程序。...通过学习和实践这些知识点,初学者可以逐步掌握QT多线程编程,为构建高效、响应迅速的应用程序打下坚实基础。

    QT多线程编程、主线程与子线程交互数据

    本文将深入探讨QT多线程编程的核心概念,主线程与子线程之间的数据交互以及如何在VS2017中进行实际应用。 首先,理解QT中的线程模型至关重要。在QT中,主线程通常负责用户界面的更新和事件处理,而子线程则可以执行...

    Qt多线程TCP服务器

    **Qt多线程TCP服务器详解** 在开发网络应用程序时,多线程技术常常被用于提高服务器的并发处理能力。Qt库作为一个跨平台的C++框架,提供了丰富的功能,包括对网络编程的支持。本篇将深入讲解如何使用Qt构建一个多...

    Qt多线程测试代码

    标题"Qt多线程测试代码"暗示了我们将探讨如何在Qt中使用多线程来执行耗时任务,以避免阻塞主线程导致用户界面(UI)无响应。在实际的软件开发中,这通常是提高用户体验的关键策略之一。 描述中提到,"Qt多线程多用于...

    Qt多线程实现 时间刷新

    1. **Qt多线程**:Qt提供了QThread类来支持多线程编程。QThread是QObject的子类,这意味着我们可以在QThread上直接发送和接收信号与槽,这是Qt事件驱动模型的一部分。 2. **QObject和线程关联**:默认情况下,所有...

    简单QT多线程聊天程序

    QT多线程技术在开发复杂的桌面应用程序时常常被用到,尤其在实现如聊天程序这样的实时交互应用中,它的优势尤为明显。这个“简单QT多线程聊天程序”旨在提供一个基础的学习平台,帮助开发者理解如何在QT环境中利用多...

    qt多线程实例-数据处理和UI界面显示

    这个实例“qt多线程实例-数据处理和UI界面显示”很可能是为了展示如何在不阻塞UI的情况下进行繁重的数据处理任务。 在单线程应用中,如果数据处理任务耗时较长,程序会冻结,用户界面无法响应,这将导致用户体验...

    QT多线程moveToThread使用方式

    `moveToThread`函数是QT多线程编程中的一个重要方法,它允许我们将一个对象移动到指定的QThread对象中,从而使该对象的工作在新的线程上下文中执行。 首先,理解多线程的基本概念至关重要。在计算机科学中,线程是...

    Qt多线程编程

    ### Qt多线程编程知识点详解 #### 一、Qt多线程编程概述 在现代软件开发中,为了提高程序的响应速度和效率,多线程技术的应用变得越来越广泛。Qt作为一个跨平台的应用程序开发框架,提供了丰富的多线程支持。Qt的...

    Qt 多线程实现动态波形图表

    本文将深入探讨如何使用Qt框架中的多线程功能,特别是结合QChart和QThread,来实现动态波形图表的高效展示。这对于理解和优化实时数据处理的软件系统具有重要意义。 首先,我们要理解Qt的QThread类。QThread是Qt...

    QT多线程调用摄像头录屏

    QT多线程调用摄像头录屏是一个涉及到计算机视觉、多媒体处理和并发编程的复杂任务。在本项目中,我们主要会使用OpenCV库来获取摄像头的视频流,Qt5框架来构建用户界面并处理多线程,以及FFmpeg工具来进行视频压缩。...

    Qt 多线程.rar

    在本实例中,我们关注的是如何在Qt框架下使用多线程。Qt是一个功能丰富的C++库,广泛应用于GUI(图形用户界面)开发,同时也提供了强大的多线程支持。 标题“Qt 多线程.rar”暗示了这是一个关于使用Qt进行多线程...

    qt多线程服务器文件传输

    本项目"qt多线程服务器文件传输"利用Qt的特性,构建了一个服务端程序,该程序能同时处理多个客户端的连接,并且能够并发地进行多个文件的传输任务。以下是对这一主题的详细解释: 1. **Qt中的多线程**: 在Qt中,...

    QT多线程小例子.zip

    本例中的"QT多线程小例子.zip"提供了两种在QT中实现多线程的方法,适用于QT5.7.0版本。 首先,我们来看"01Thread"这个例子,它展示了QT4中的多线程处理方式。在QT4中,我们可以使用QThread类直接创建和管理线程。在...

Global site tag (gtag.js) - Google Analytics