/*
开通csdn以来 都没写过文章(只是偷偷的看) 这算是第一篇文章 今天coding 写到了 随手记下
需求:大概就是写个执行器 然后执行器有一些回调函数 外部具体来实现回调函数
有问题请发邮件: 457952887@qq.com
转载请写出处:http://blog.csdn.net/d457952887
*/
#include <windows.h>
#include <map>
// 声明一个接口类
// 这个接口类 对管理器提供接口
class CallFunClass
{
public:
CallFunClass(){}
virtual ~CallFunClass(){}
virtual void callFunction(){}
};
// 声明 函数指针
// 也就是把函数搞成一个变量
typedef void (CallFunClass::*callFun)();
#define CALLFUNC(_func) (callFun)(&_func)
enum eExecState
{
ES_NONE = 0 ,
ES_RUN_PRO ,
ES_RUNING ,
ES_RUN_POST ,
ES_MAX
};
typedef std::map<int, callFun> CallFunTable;
class Executor
{
public:
Executor(CallFunClass *callClass):
m_pCallClass(callClass),
m_eExecState(ES_NONE)
{
}
virtual ~Executor(){}
void setState(eExecState state){ m_eExecState = state; }
eExecState getState(){ return m_eExecState; }
// 注册回调函数
void registerCallFunc(callFun callF, int funID){ m_CallFunTable[funID] = callF; }
void run()
{
// 回调到id的函数 switch(m_eExecState)
{
case ES_NONE:{ callBackFun(ES_NONE); /*do something*/ } break;
case ES_RUN_PRO:{ callBackFun(ES_RUN_PRO); /*do something*/ } break;
case ES_RUNING:{ callBackFun(ES_RUNING); /*do something*/ } break;
case ES_RUN_POST:{ callBackFun(ES_RUN_POST); /*do something*/ } break;
}
}
protected:
// 回调到id的函数
bool callBackFun(int funID)
{
bool bCall = false;
CallFunTable::iterator iter = m_CallFunTable.find(funID);
if (iter != m_CallFunTable.end())
{
callFun callF = iter->second;
// 解地址 函数调用
(m_pCallClass->*callF)();
bCall = true;
}
return bCall;
}
private:
eExecState m_eExecState;
CallFunTable m_CallFunTable;
CallFunClass *m_pCallClass;
};
// 回调函数类
class MyClass : public CallFunClass
{
public:
MyClass(){}
~MyClass(){}
void func0(){ printf("func0\n"); /*do something*/ }
void func1(){ printf("func1\n");/*do something*/ }
void func2(){ printf("func2\n");/*do something*/ }
void func3(){ printf("func3\n");/*do something*/ }
};
// ok 测试一下
int main()
{
MyClass myClass;
Executor exec(&myClass);
exec.registerCallFunc(CALLFUNC(MyClass::func0), ES_NONE);
exec.registerCallFunc(CALLFUNC(MyClass::func1), ES_RUN_PRO);
exec.registerCallFunc(CALLFUNC(MyClass::func2), ES_RUNING);
exec.registerCallFunc(CALLFUNC(MyClass::func3), ES_RUN_POST);
while (true)
{
exec.run();
int state = (int)exec.getState();
exec.setState(((eExecState)state >= ES_MAX) ? ES_NONE : (eExecState)++state);
Sleep(1000);
}
return 0;
}
//例子在vs2008下测试通过
/*
另外:主要我这这儿遇到个问题 如果建立个mfc dialog框 使用dialog类继承CallFunClass 在声明实现回调函数 那么函数调用就会有问题
对mfc 这个不怎么熟悉 觉得这个太难用了 求解??? 如果晓得 请告之我 谢谢
*/