异步操作

来源:互联网 发布:中信淘宝信用卡怎么样 编辑:程序博客网 时间:2024/06/06 00:04

  对于游戏开发而言,经常使用到异步相关操作,因此在使用moduleframework之前应该提供一个异步操作的类。 以后相关的异步操作均继承这个类

  AsyncOperation:

  先贴出代码:

  #ifndef __ASYNC_OPERATION_H__

  #define __ASYNC_OPERATION_H__

  #include

  class AsyncOperation

  {

  public:

  typedef boost::function(void) TypeOnExecute;

  typedef boost::function(void) TypeOnComplete;

  typedef boost::function(void) TypeOnAborted;

  // 委托执行函数

  explicit AsyncOperation(TypeOnExecute onExecute)

  :_onExecute(onExecute)

  {

  if(!_onExecute) throw "onExecute is NULL";

  }

  virtual AsyncOperation(){}

  void Execute(TypeOnComplete onComplete, TypeOnAborted onAorted = NULL)

  {

  if (!_onComplete) throw "onComplete is NULL"

  _onComplete = onComplete;

  _onAborted = onAorted;

  _onExecute(this);

  }

  virtual void Abort()

  {

  }

  void Complete()

  {

  _onComplete(this);

  }

  private:

  TypeOnExecute _onExecute;

  TypeOnComplete _onComplete;

  TypeOnAborted _onAborted;

  };

  #endif

  真正的执行函数是Execute 另外提供了一个完成 和终止的接口。

  这个类应该比较简单。

  在此类的基础上构建一个异步队列。 AsyncQueue继承该类

  #ifndef __ASYNC_QUEUE_H__

  #define __ASYNC_QUEUE_H__

  #include

  #include "AsyncOpertaion.hpp"

  #include

  #include

  using namespace std;

  class AsyncQueue : public AsyncQueue

  {

  public:

  // 构造函数默认调用ExecuteNextChild来启动整个异步进程

  AsyncQueue(): AsyncOperation(boost::bind(&AsyncQueue::ExecuteNextChild, this, _1))

  , _abortFlag(false)

  {

  }

  ~AsyncQueue()

  {

  TypeOptQueue::iterator it = _queue.begin();

  for (; it != _queue.end(); ++it)

  {

  delete *it;

  }

  }

  // 加入队列

  void Push(AsyncOperation* operation)

  {

  _queue.push_back(operation);

  }

  // 终止执行

  void Abort()

  {

  if(_queue.empty()) return;

  _abortFlag = true;

  AsyncOperation* front = _queue.front();

  front->Abort(); // 终止队列首位的执行

  }

  private:

  void ExecuteNextChild(AsyncOperation* operation)

  {

  if(_queue.empty())

  {

  LOG(ERROR) << "Async Queue is Empty!";

  return;

  }

  // 迭代执行_queue中的操作

  AsyncOperation* front = _queue.front();

  front->Execute(boost::bind(&AsyncQueue::OnChildComplete, this, _1));

  }

  void OnChildComplete(AsyncOperation* operation)

  {

  // 移除已执行的异步操作

  _queue.pop_front();

  delete operation;

  if (_queue.empty())

  {

  // 通知队列执行完成

  Complete();

  return;

  }

  if (_abortFlag && _onAborted)

  {

  _onAborted(this);

  }else

  {

  // 迭代执行

  ExecuteNextChild(0);

  }

  }

  private:

  typedef deque TypeOptQueue; // 使用队列来包装

  TypeOptQueue _queue;

  bool _abortFlag;

  };

  #endif

  这里一个巧妙指出在于 如果迭代执行整个异步队列, 注意看 构造函数和OnExecuteNextChild 这两点 。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 随着年龄的增长脖子越来越短怎么办 安装软件时解析包出现问题怎么办 鼻子吸进去的气往嘴巴里怎么办 做完瑜伽之后大腿后侧特别紧怎么办 刚下生小狗腿后腿站不起来怎么办 脚被凳子压到了流血了怎么办还很痛 小狗脚被凳子压出血了怎么办 怀孕8个月脐带绕颈一周怎么办 练完瑜伽大腿两侧肌肉麻木怎么办 突然吃了辣火锅肚子烫怎么办 副鼻窦炎鼻头顶痛鼻子臭怎么办 一岁宝宝夜里睡觉不踏实怎么办 分手一个月了还是放不下前任怎么办 当晚上遇到烦心事睡不着该怎么办 为什么白天太累晚上就睡不着怎么办 白天走累的脚痛晚上睡不着怎么办 1岁宝宝感冒咳嗽流泪流鼻涕怎么办 宝宝不含母乳只吃奶瓶怎么办 宝宝习惯奶嘴不咬妈妈的乳头怎么办 我的乳晕和私处色素沉着怎么办 双盘打坐膝痛腿脚心处紫青怎么办? 双盘打坐两膝盖不能着地怎么办? 做完蹲起之后腿疼的受不了怎么办 孩子游泳学不会不想去了怎么办 自由泳打腿走水但水花大怎么办 老师上课发现学生课上自慰怎么办 生完孩子腿粗屁股大怎么办 产后42天检查子宫偏大怎么办 崇拜瑜伽老师喜欢上他了怎么办 练瑜伽下不了腰贴不住腿怎么办 吃母乳宝宝吸的奶头疼怎么办 孩子吃奶把奶头咬破了怎么办 奶头边上让孩子咬破了吃奶疼怎么办 腰部受过伤久坐缓解腰疼怎么办 小孩八个月了还在软得很怎么办 产后第三天乳房胀痛有硬块怎么办 怀孕七个多月了胎位不正怎么办 怀孕6个月梅毒1:4怎么办 怀孕了胃酸胃涨吐酸水怎么办 怀孕了胃酸胃胀吐酸水怎么办 练瑜伽大腿外侧扭筋了怎么办