回调框架 不知道异步可以用不,在尝试

原创 2015年07月07日 19:43:11
#include <iostream>
using namespace std;

class ITransaction
{
public:
	virtual ~ITransaction(){}
};
class Task
{
public:
	virtual int process(ITransaction *) = 0;
	virtual void doAfterSync(ITransaction *ctx)
	{

	}
	void setCompleteListener(Task *l)
	{
		mListener = l;
	}
	void complited(ITransaction *ctx)
	{
		std::cout << "complited..." << std::endl;
		if (mListener) {
			mListener->doAfterSync(ctx);
		} else {
			std::cout << "mListener is null" << std::endl;
		}
	}
private:
	Task *mListener;
};

enum {
	START = 0,
	A_START,
	A_COMPLETE,
	B_START,
	B_COMPLETE
};

std::string strStatus[] = {"start", "a_start", "a_complete", "b_start", "b_complete"};
class Transaction : public ITransaction
{
public:
	Transaction():status(START){}
	int status;
};

class TaskA : public Task
{
public:
	TaskA()
	{
	}

	void setBTask(Task *taskB)
	{
		taskB_ = taskB;
	}
	int process(ITransaction *ctx)
	{
		ctx_ = dynamic_cast<Transaction *>(ctx);
		std::cout << "TaskA is running..., status is " << strStatus[ctx_->status] << std::endl;
		switch (ctx_->status)
		{
			case START:
				ctx_->status = A_START;
				std::cout << "status is " << strStatus[ctx_->status] << std::endl;

				taskB_->setCompleteListener(this);
				taskB_->process(ctx_);
				return 1; // not finished
			case B_COMPLETE:
				complited(ctx_);
				return 0;
		}
	}
	void doAfterSync(ITransaction *ctx)
	{
		std::cout << "TaskA::doAfterSync"<< std::endl;
		if (ctx_->status == B_COMPLETE) {
			process(ctx);
		}
	}
private:
	Task *taskB_;
	Transaction *ctx_;
};

class TaskB : public Task
{
public:
	int process(ITransaction *ctx)
	{
		std::cout << "TaskB is running..." << std::endl;
		ctx_ = dynamic_cast<Transaction *>(ctx);
		ctx_->status = B_COMPLETE;
		std::cout << "status is " << strStatus[ctx_->status] << std::endl;
		complited(ctx_);
		return 0;
	}
private:
	Transaction *ctx_;
};

class Controller
{
public:
	Controller(TaskA *taskA, TaskB *taskB) : taskA_(taskA), taskB_(taskB)
	{
	}
	void do_process(Transaction *ctx_)
	{
		taskA_->process(ctx_);
	}

	TaskA *taskA_;
	TaskB *taskB_;
};

int main()
{
	Transaction *ctx = new Transaction;

	TaskA *taskA = new TaskA();
	TaskB *taskB = new TaskB();
	taskA->setBTask(taskB);

	Controller *ctl = new Controller(taskA, taskB);
	ctl->do_process(ctx);
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

你不知道的JavaScript--Item9 call(),apply(),bind()与回调

1、call(),apply(),bind()方法JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的...

dataGridView异步回调

  • 2011-01-11 17:31
  • 89KB
  • 下载

你可以不知道原因,但是不能停止尝试。httplook抓取路由配置界面信息

用httplook、sniffer等工具对浏览器动作进行抓取,如路由配置界面信息。然后实现使用curl命令在命令行中模拟浏览器动作。从而实现通过命令行的方式对路由进行配置的过程!如果需要动态自动访问某...

C#异步回调

  • 2014-02-14 10:39
  • 49KB
  • 下载

关于“打开项目**时发生问题,尝试退出并重新启动应用程序。如果问题仍然存在,则可能是由于正在使用不支持的项目版本,或者项目文件可能损坏”的问题的解决办法。

做的flex的一个企业管理方面的系统,可到收尾阶段了,从svn上传下的代码,在我改了一些路径后出现如标题所示问题,困扰啊那是。今天终于解决了办法。 方法步骤: 1  、新建工程项目,项目名称跟出问...

你不知道的JavaScript--Item27 异步编程异常解决方案

1、JavaScript异步编程的两个核心难点异步I/O、事件驱动使得单线程的JavaScript得以在不阻塞UI的情况下执行网络、文件访问功能,且使之在后端实现了较高的性能。然而异步风格也引来了一些...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)