代理
本地C++中的函数指针,提供了一种异步执行代码的机制,你可以存储一个函数指针,而在以后有需要的时候及时地调用,这通常用于把某算法与实现代码分开来,如在搜索中比较对象。另外,它也可在不同的线程中调用,以实现真实的异步编程。以下是一个ThreadPool类的简单示例,允许你排列一系列的函数指针,并在工作者线程中执行。
| class ThreadPool { public: template <typename T> static void QueueUserWorkItem(void (T::*function)(), T* object) { typedef std::pair<void (T::*)(), T*> CallbackType; std::auto_ptr<CallbackType> p(new CallbackType(function, object)); if (::QueueUserWorkItem(ThreadProc<T>, p.get(), WT_EXECUTEDEFAULT)) { //ThreadProc负责删除pair. p.release(); } else { AtlThrowLastWin32(); } } private: template <typename T> static DWORD WINAPI ThreadProc(PVOID context) { typedef std::pair<void (T::*)(), T*> CallbackType; std::auto_ptr<CallbackType> p(static_cast<CallbackType*>(context)); (p->second->*p->first)(); return 0; } ThreadPool(); }; |
| class Service { public: void AsyncRun() { ThreadPool::QueueUserWorkItem(Run, this); } void Run() { //其他代码 } } |
| delegate void Function(); |
| ref struct ReferenceType { void InstanceMethod() {} static void StaticMethod() {} }; //创建代理并绑定到成员函数的实例 Function^ f = gcnew Function(gcnew ReferenceType, ReferenceType::InstanceMethod); //也可绑定到静态成员函数,并结合几个代理形成代理链 f += gcnew Function(ReferenceType::StaticMethod); //调用函数 f(); |