【Cocos2d-x Lua】异步任务工具类

Cocos2d-x Lua 异步任务工具类 多线程的使用
摘要由CSDN通过智能技术生成

思路


实现思路


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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值