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;
};