qt 线程编程

简介: qt 线程编程

本篇文章来介绍一下老生常谈的问题 那就是qt线程编程

1.QThread类

QThread 是 Qt 中处理多线程的传统方式。每个 QThread 对象代表一个线程。要在线程中运行的代码通常放在 QObject 派生的类中,并重写 run() 方法。然后,可以将这个对象移到新线程中。

代码示例:

class Worker : public QObject  
{  
    Q_OBJECT  
public slots:  
    void doWork() {  
        // 这里是线程要执行的代码  
    }  
};  
  
// 在某个地方创建线程和工作对象  
QThread *thread = new QThread;  
Worker *worker = new Worker;  
worker->moveToThread(thread);  
  
// 连接信号和槽  
connect(thread, &QThread::started, worker, &Worker::doWork);  
connect(worker, &Worker::workFinished, thread, &QThread::quit);  
connect(worker, &Worker::workFinished, worker, &Worker::deleteLater);  
connect(thread, &QThread::finished, thread, &QThread::deleteLater);  
  
// 开始线程  
thread->start();

2.使用 Qt 并发库

Qt 5 引入了 Qt Concurrent 模块,它提供了一种更简单的方式来编写并发代码,而无需直接处理线程。Qt Concurrent 提供了一组函数,如 QtConcurrent::run(),它可以在一个新的线程中执行任何可调用的对象。

示例代码:

#include <QtConcurrent/QtConcurrentRun>  
  
void someFunction() {  
    // 这里是线程要执行的代码  
}  
  
// 在某个地方调用函数  
QtConcurrent::run(someFunction);

注意事项:

  • 线程安全:在多线程环境中,需要特别注意线程安全问题,如访问共享资源时的竞态条件。
  • 信号和槽:Qt 的信号和槽机制是线程安全的,可以在不同线程之间安全地发送信号和槽。
  • 资源访问:避免在多个线程中同时访问 GUI 组件,因为这可能导致不可预测的行为。如果需要更新 GUI,应该使用信号和槽机制将更新请求发送到主线程。
  • 线程退出:确保线程在完成任务后正确退出,并释放所有资源。

 

3.qt锁的应用

Qt 锁是 Qt 框架中提供的一种机制,用于保护共享资源免受多个线程的同时访问,以防止数据竞争和不一致。Qt 提供了几种不同类型的锁,以满足不同的需求。

  1. QMutex(互斥锁)这是最基本的锁类型,用于确保同一时间只有一个线程可以访问某个资源。如果一个线程已经锁定了互斥锁,任何其他尝试锁定该互斥锁的线程都将被阻塞,直到原始线程释放锁。
  2. QReadWriteLock(读写锁)这种锁允许多个线程同时读取共享资源,但在写入资源时只允许一个线程访问。如果一个线程已经锁定了写锁,其他所有尝试读取或写入资源的线程都将被阻塞。如果一个线程已经锁定了读锁,其他线程仍然可以锁定读锁以读取资源,但不能锁定写锁。Qt 的 QReadWriteLock 默认使用写优先策略,这意味着当写锁可用时,它会被优先分配给请求写锁的线程。
  3. QSemaphore(信号量)信号量是一个计数器,用于控制对共享资源的访问。线程可以请求(即“获取”)一定数量的信号量,如果信号量可用,则请求成功,线程可以继续执行。如果信号量不可用,线程将被阻塞,直到有足够的信号量可用。信号量常用于实现生产者-消费者问题、资源池等场景。

qt QMutex锁代码实例:

#include <QMutex>  
#include <QThread>  
#include <QDebug>  
  
class SharedResource {  
public:  
    SharedResource() : value(0) {}  
  
    // 锁定互斥锁以访问共享数据  
    void setValue(int newValue) {  
        QMutexLocker locker(&mutex); // 使用 QMutexLocker 自动管理锁的获取和释放  
        value = newValue;  
    }  
  
    int getValue() {  
        QMutexLocker locker(&mutex); // 使用 QMutexLocker 自动管理锁的获取和释放  
        return value;  
    }  
  
private:  
    int value;  
    QMutex mutex; // 互斥锁用于保护共享数据  
};
class WorkerThread : public QThread {  
    Q_OBJECT  
  
public:  
    WorkerThread(SharedResource *resource, QObject *parent = nullptr)  
        : QThread(parent), resource(resource) {}  
  
protected:  
    void run() override {  
        // 模拟线程工作,比如增加共享资源的值  
        for (int i = 0; i < 10; ++i) {  
            resource->setValue(resource->getValue() + 1);  
            qDebug() << "Thread" << currentThreadId() << "value:" << resource->getValue();  
            QThread::sleep(1); // 暂停一秒以模拟工作  
        }  
    }  
  
private:  
    SharedResource *resource;  
};
int main(int argc, char *argv[]) {  
    QCoreApplication app(argc, argv);  
  
    SharedResource resource;  
  
    // 创建并启动工作线程  
    WorkerThread *thread1 = new WorkerThread(&resource);  
    WorkerThread *thread2 = new WorkerThread(&resource);  
  
    thread1->start();  
    thread2->start();  
  
    // 等待线程完成  
    thread1->wait();  
    thread2->wait();  
  
    qDebug() << "Final value:" << resource.getValue();  
  
    return app.exec();  
}

在这里祝大家新的一年财源广进

好了 本篇文章就到这里结束了 在这里我向大家推荐一个高质量课程:

https://xxetb.xetslk.com/s/2PjJ3T

相关文章
|
17天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
19天前
|
安全 Java 开发者
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第9天】本文将深入探讨Java并发编程的核心概念,包括线程安全和性能优化。我们将详细解析Java中的同步机制,包括synchronized关键字、Lock接口以及并发集合等,并探讨它们如何影响程序的性能。此外,我们还将讨论Java内存模型,以及它如何影响并发程序的行为。最后,我们将提供一些实用的并发编程技巧和最佳实践,帮助开发者编写出既线程安全又高效的Java程序。
|
16天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
2天前
|
缓存 Java
Java并发编程:深入理解线程池
【4月更文挑战第26天】在Java中,线程池是一种重要的并发工具,它可以有效地管理和控制线程的执行。本文将深入探讨线程池的工作原理,以及如何使用Java的Executor框架来创建和管理线程池。我们将看到线程池如何提高性能,减少资源消耗,并提供更好的线程管理。
|
10天前
|
安全 Java 调度
Java并发编程:深入理解线程与锁
【4月更文挑战第18天】本文探讨了Java中的线程和锁机制,包括线程的创建(通过Thread类、Runnable接口或Callable/Future)及其生命周期。Java提供多种锁机制,如`synchronized`关键字、ReentrantLock和ReadWriteLock,以确保并发访问共享资源的安全。此外,文章还介绍了高级并发工具,如Semaphore(控制并发线程数)、CountDownLatch(线程间等待)和CyclicBarrier(同步多个线程)。掌握这些知识对于编写高效、正确的并发程序至关重要。
|
11天前
|
缓存 分布式计算 监控
Java并发编程:深入理解线程池
【4月更文挑战第17天】在Java并发编程中,线程池是一种非常重要的技术,它可以有效地管理和控制线程的执行,提高系统的性能和稳定性。本文将深入探讨Java线程池的工作原理,使用方法以及在实际开发中的应用场景,帮助读者更好地理解和使用Java线程池。
|
12天前
|
缓存 监控 Java
Java并发编程:线程池与任务调度
【4月更文挑战第16天】Java并发编程中,线程池和任务调度是核心概念,能提升系统性能和响应速度。线程池通过重用线程减少创建销毁开销,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。任务调度允许立即或延迟执行任务,具有灵活性。最佳实践包括合理配置线程池大小、避免过度使用线程、及时关闭线程池和处理异常。掌握这些能有效管理并发任务,避免性能瓶颈。
|
12天前
|
设计模式 运维 安全
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第15天】在Java开发中,多线程编程是提升应用程序性能和响应能力的关键手段。然而,它伴随着诸多挑战,尤其是在保证线程安全的同时如何避免性能瓶颈。本文将探讨Java并发编程的核心概念,包括同步机制、锁优化、线程池使用以及并发集合等,旨在为开发者提供实用的线程安全策略和性能优化技巧。通过实例分析和最佳实践的分享,我们的目标是帮助读者构建既高效又可靠的多线程应用。
|
18天前
|
Java
Java并发编程:深入理解线程池
【4月更文挑战第10天】本文将深入探讨Java并发编程中的一个重要主题——线程池。我们将从线程池的基本概念入手,逐步深入到线程池的实现原理,以及如何在实际开发中合理使用线程池。通过本文的学习,你将能够理解线程池的核心原理,掌握线程池的使用技巧,以及避免常见的线程池使用误区。
|
18天前
|
监控 安全 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第10天】 在Java开发中,并发编程是提升应用性能和响应能力的关键手段。然而,线程安全问题和性能调优常常成为开发者面临的挑战。本文将通过分析Java并发模型的核心原理,探讨如何平衡线程安全与系统性能。我们将介绍关键的同步机制,包括synchronized关键字、显式锁(Lock)以及并发集合等,并讨论它们在不同场景下的优势与局限。同时,文章将提供实用的代码示例和性能测试方法,帮助开发者在保证线程安全的前提下,实现高效的并发处理。

推荐镜像

更多