C++使用函数指针和注册回调函数,写一个异步回调函数使用案例
时间: 2024-09-12 08:10:23 浏览: 40
在C++中,函数指针是一种强大的工具,常用于处理回调机制,特别是在异步编程中。当一个线程需要完成某个任务并通知另一个线程任务已完成,它会将一个指向回调函数的指针传递给负责处理这个任务的函数。当任务完成后,主函数会调用这个函数指针来执行相应的操作。
下面是一个简单的例子,假设我们有一个`AsyncWorker`类,它执行一些耗时的操作,并提供一个`RegisterCallback`方法来注册一个回调函数,当操作完成时会被调用:
```cpp
#include <iostream>
#include <future>
// 定义一个回调函数模板
template<typename RetType>
void callback_function(RetType result) {
std::cout << "Task completed with result: " << result << '\n';
}
class AsyncWorker {
public:
// 异步执行任务并注册回调
template<typename RetType>
void ExecuteTaskWithCallback(std::function<void(RetType)> callback) {
future_result = std::async(std::launch::async, doWork, /* 进行耗时计算的参数 */);
future_result.then([callback](auto&& result) {
callback(result.get()); // 当任务完成,调用回调函数
});
}
private:
std::future<RetType> future_result;
// 虚拟的执行任务函数
virtual RetType doWork() = 0; // 子类必须实现此函数
protected:
// 实现具体的任务执行
virtual RetType doWorkImpl() {
// 这里进行实际的工作,如IO操作等...
return /* 返回结果 */;
}
};
// 测试子类
class MyWorker : public AsyncWorker {
public:
RetType doWork() override { return doWorkImpl(); } // 实现doWork
};
int main() {
MyWorker worker;
auto myCallback = std::bind(callback_function<int>, _1); // 创建一个接受整数的回调函数
worker.ExecuteTaskWithCallback(myCallback); // 注册回调
// 主线程继续执行其他任务...
// (异步worker的任务在这段时间内完成)
return 0;
}
```
在这个例子中,当你创建一个`MyWorker`实例并执行`ExecuteTaskWithCallback`时,如果任务完成,回调函数`myCallback`就会收到返回的结果。这样就实现了异步操作后的回调功能。
阅读全文