alin的学习之路:任务队列的封装

alin的学习之路:任务队列的封装

5. 任务队列

  • 当有多个线程进行任务的处理时,如果有多个线程在当前任务还没有完成的情况下又发起了另一个任务,那么将可能导致程序崩溃的情况,此时解决的方法是使用任务队列。

任务队列是一个队列,可以使用STL中的queue

  • 那么队列中的每一个任务的类型是什么呢?
    • 首先考虑每一个任务都是什么? 都是一个函数,也就是一个函数的地址,每一个函数的调用除了需要函数的地址,还需要函数的参数
    • 那么可以定义一个结构体,里面存的是函数的指针和函数的参数。
    • 可以将所有任务函数的返回值都设置成相同的,并且将所有的函数参数都设置成void*类型,那么此时可以向其中传递任意的参数

得到结论 -> 任务队列中的任务类型:

// 任务队列的模型
// 存储任务的队列一个就够了, 因此任务队列类也应该是单例模式
/*
操作函数:
	1. 往任务队列中存储任务
	2. 从任务对列中往外拿任务
	3. 检测任务队列中任务的个数
	4. 清空任务队列中的任务
成员变量:
	1. 需要一个存储任务的容器(队列), 里边存储的是函数指针
*/

// 定义函数指针
typedef void (*callback)(void*);

// 任务的类型
struct Task
{
    // 函数指针
    callback function = NULL;
    // 函数参数, 保存函数调用的时候用到的实参
    void* arg = NULL;
};

// 得到的类
class TaskQueue
{
public:
    // 1. 往任务队列中存储任务
	// 2. 从任务对列中往外拿任务
	// 3. 检测任务队列中任务的个数
	// 4. 清空任务队列中的任务
private:
    TaskQueue();
    TaskQueue(const TaskQueue& t);
    
private:
    QQueue<Task> m_taskQ;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值