当前位置:   article > 正文

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

lua异步执行

思路


实现思路


1.使用pthread库,封装一个用于执行异步任务的类,该类提供一个方法接受一个lua function,然后在子线程中执行该function。
2.使用tolua++工具把C++自定义类绑定到Lua。

代码思路(伪代码)


定义一个C++类AsynTaskHandler用于处理Lua中需要执行的异步任务,这个类中有一个队列(先进先出)用于存放任务。
  1. Task task = NULL;
  2. //在子线程中启动一个循环去处理队列中的任务
  3. while(true){
  4. //定义一个bool变量标记是否退出循环,在循环开始时判断是否需要退出循环
  5. if(need_quit){
  6. break;
  7. }
  8. task = NULL;
  9. //从队列中获取任务
  10. task = task_queue.pop()
  11. //如果队列为空
  12. if(NULL == task){
  13. //当前线程进行睡眠状态,等待主线程添加任务并唤醒当前线程
  14. thread_sleep();
  15. //当线程被唤醒,继续当前循环
  16. continue;
  17. }
  18. //如果成功获取到任务则执行任务
  19. doTask(task);
  20. task.release();
  21. }
  22. //如果退出了循环
  23. //清理任务队列和资源
  24. if(task_queue){
  25. task_queue.clear();
  26. task_queue = NULL;
  27. }
  28. //退出线程
  29. thread_exit();
  30. //初始化
  31. void AsynTaskHandler::lazyInit()
  32. {
  33. //如果任务队列未初始化
  34. if (taskQueue == NULL)
  35. {
  36. //创建任务队列
  37. taskQueue = queue.create();
  38. // 创建线程
  39. thread_create();
  40. // 执行线程
  41. thead_execute();
  42. // 初始化退出标记为flase
  43. need_quit = false;
  44. }
  45. }
  46. // 添加任务
  47. void AsynTaskHandler::addTask(int task)
  48. {
  49. // 初始化
  50. lazyInit();
  51. // 添加到任务队列
  52. task_queue.add(task);
  53. // 唤醒工作线程
  54. thread_wakeup();
  55. }

实现


  1. #include "AsynTaskHandler.h"
  2. #include "CCLuaEngine.h"
  3. #include
  4. //#include
  5. // 单例
  6. static AsynTaskHandler *s_pAsynTask = NULL;
  7. // 任务队列
  8. static CCArray* s_taskQueue = NULL
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/871729
推荐阅读
相关标签
  

闽ICP备14008679号