思路
实现思路
1.使用pthread库,封装一个用于执行异步任务的类,该类提供一个方法接受一个lua function,然后在子线程中执行该function。
2.使用tolua++工具把C++自定义类绑定到Lua。
代码思路(伪代码)
定义一个C++类AsynTaskHandler用于处理Lua中需要执行的异步任务,这个类中有一个队列(先进先出)用于存放任务。
Task task = NULL;
//在子线程中启动一个循环去处理队列中的任务
while(true){
//定义一个bool变量标记是否退出循环,在循环开始时判断是否需要退出循环
if(need_quit){
break;
}
task = NULL;
//从队列中获取任务
task = task_queue.pop()
//如果队列为空
if(NULL == task){
//当前线程进行睡眠状态,等待主线程添加任务并唤醒当前线程
thread_sleep();
//当线程被唤醒,继续当前循环
continue;
}
//如果成功获取到任务则执行任务
doTask(task);
task.release();
}
//如果退出了循环
//清理任务队列和资源
if(task_queue){
task_queue.clear();
task_queue = NULL;
}
//退出线程
thread_exit();
//初始化
void AsynTaskHandler::lazyInit()
{
//如果任务队列未初始化
if (taskQueue == NULL)
{
//创建任务队列
taskQueue = queue.create();
// 创建线程
thread_create();
// 执行线程
thead_execute();
// 初始化退出标记为flase
need_quit = false;
}
}
// 添加任务
void AsynTaskHandler::addTask(int task)
{
// 初始化
lazyInit();
// 添加到任务队列
task_queue.add(task);
// 唤醒工作线程
thread_wakeup();
}
实现
#include "AsynTaskHandler.h"
#include "CCLuaEngine.h"
#include
//#include
// 单例
static AsynTaskHandler *s_pAsynTask = NULL;
// 任务队列
static CCArray* s_taskQueue = NULL