QT单例模式

该代码实现了一个基于Qt库的线程安全任务队列,使用单例模式确保全局唯一实例。TaskQueue类包含添加任务、删除任务和检查队列是否为空的方法,所有对任务队列的操作都通过互斥锁QMutex进行同步,保证了多线程环境下的数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式的任务队列

需要的头文件

#include <QQueue>
#include <QMutex>
#include <QMutexLocker>

taskqueue.h文件


#include <QQueue>
#include <QMutex>
#include <QMutexLocker>
#include <QString>
/**
 * @brief The TaskQueue class 任务队列
 */
class TaskQueue
{

public :
    //对外提供获取实例的函数
    static TaskQueue* instance()
    {
        return m_TaskQueue;
    }
    //判断任务队列是否为空
    bool isEmpty();
    //添加任务
    void pushTask(const QString task);
    //获取一个任务
    QString popTask(bool *ok=nullptr);
private:
    TaskQueue() = default;//私有构造函数,= default:表示使用编译器提供的默认构造
    TaskQueue(const TaskQueue& taskQueue) = default;//私有拷贝构造函数
    TaskQueue& operator=(const TaskQueue& taskQueue) = default;//私有赋值操作符
    //私有实例
    static TaskQueue* m_TaskQueue;

    //任务队列
    QQueue<QString> m_Tasks;
    //互斥锁
    QMutex m_Mutex;
};

#endif // TASKQUEUE_H

taskqueue.cpp文件

#include "taskqueue.h"

//类外初始化静态成员变量
TaskQueue *TaskQueue::m_TaskQueue = new TaskQueue();

/**
 * @brief TaskQueue::isEmpty 判断是否为空
 * @return
 */
bool TaskQueue::isEmpty()
{
    QMutexLocker locker(&m_Mutex);//加锁,保证线程安全
    if(m_Tasks.empty())
        return true;
    return false;
}

/**
 * @brief TaskQueue::pushTask 添加一个任务
 * @param task
 */
void TaskQueue::pushTask(const QString task)
{
    QMutexLocker locker(&m_Mutex);//加锁,保证线程安全
    m_Tasks.enqueue(task);
}

/**
 * @brief TaskQueue::popTask 删除一个任务
 * @return
 */
QString TaskQueue::popTask(bool *ok)
{
    QMutexLocker locker(&m_Mutex);//加锁,保证线程安全
    QString task;
    if(m_Tasks.empty())
    {
        *ok = false;
    }else
    {
        task = m_Tasks.dequeue();
        *ok = true;
    }
    return task;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值