timer - 如何使用静态 C++ 方法作为 Poco 计时器的回调?
问题描述
特别是我在谈论这个 Poco 类的构造函数:Poco.TimerCallback
我想在遗留的 C++ 代码中使用它,其中我编写的大多数类都是“静态的”,因此它们只包含静态方法而没有构造函数,只是因为无论如何我都不需要此类对象的多个实例,而且类仅用于封装。好吧,Poco 的人建议添加这样的回调方法:
TimerCallback<MyClass> callback(*this, &MyClass::onTimer);
timer.start(callback);
我对这段代码的理解是否正确:MyClass::onTimer
也可能是 的静态方法MyClass
,但我还需要 的当前实例MyClass
,这样未实例化的静态类的方法就被简单地禁止用作TimerCallback
,还是我错了?
谢谢你。
解决方案
我不会称它为“禁止”——函数回调只是没有实现,没有什么能阻止你自己实现它(如果你愿意的话,把它作为贡献发回)。
我只是扩展TimerTaskAdapter,这样它就不需要对象实例,例如。像这样的东西:
typedef void (*FunctionCallback)(TimerTask&);
TimerTaskAdapter(FunctionCallback func): _pObject(0), _method(0), _func(func){}
...
FunctionCallback _func;
然后检测TimerTaskAdapter::run()
什么是null以及是否调用方法或函数:
void run()
{
if (_pObject) (_pObject->*_method)(*this);
else (*_func)(*this);
}
推荐阅读
- titanium - 在 appcelerator Titan 中实现图像视图的暂停和重新启动动画
- android - MPChartAndroid - 具有多个数据集的折线图
- delphi - IEqualityComparer 和字符串
- c# - 使用 JavaScript 将元素滚动到视图后,Selenium '元素无法滚动到视图中'
- laravel - 电子商务:我该如何进行跟踪程序?
- angular6 - 没有指令“exportAs”设置为“matAutocompleteOrigin”
- android - 通过片段让 UnityPlayer 保持活力
- sql - Postgresql递归解析嵌套JSON
- window.opener - 如何在 window.open() 方法被触发的同一页面中的 window.open() 方法中获取 url 的响应?
- xml - 在 .vcxproj 中为 Visual Studio 2017 设置目标名称