我特别是在谈论这个Poco类的构造函数:Poco.TimerCallback
我想在遗留的C ++代码中使用它,因为我编写的大多数类都是“静态”的,因此它们只包含静态方法而没有构造函数,仅因为我始终不需要此类对象的多个实例,这些类仅用于封装。是的,Poco伙计们建议添加这样的回调方法:
TimerCallback<MyClass> callback(*this, &MyClass::onTimer);
timer.start(callback);
我是否正确理解了以下代码段:MyClass::onTimer
也可能是MyClass
的静态方法,但是我还需要MyClass
的当前实例,因此静态类的方法,哪些没有实例化,只是被禁止用作TimerCallback
,还是我错了?
谢谢。
答案 0 :(得分:1)
我不会将其称为“禁止的”-函数回调只是未实现,没有什么阻止您自己实现(如果愿意的话,可以将其作为贡献发送回去)。
我只扩展TimerTaskAdapter,这样它就不需要对象实例,例如。像这样的东西:
typedef void (*FunctionCallback)(TimerTask&);
TimerTaskAdapter(FunctionCallback func): _pObject(0), _method(0), _func(func){}
...
FunctionCallback _func;
然后在TimerTaskAdapter::run()
中检测什么为空以及是否调用方法或函数:
void run()
{
if (_pObject) (_pObject->*_method)(*this);
else (*_func)(*this);
}
答案 1 :(得分:0)
在扩展TimerTaskAdapter
时遇到了一个更棘手的问题(与指向类成员的指针有关),有人建议直接从TimerTask
派生我的班级:Pointer to member type incompatible with object type → What is the cause?
查看此源代码:
ProceduralTimerTaskAdapter.h:
// Header file for ProceduralTimerTaskAdapter.cpp class file.
// This is an extension of the Poco::Util::TimerTask class.
#include <Poco/Util/Timer.h>
#include <Poco/Util/TimerTask.h>
#ifndef PROCEDURALTIMERTASKADAPTER_H
#define PROCEDURALTIMERTASKADAPTER_H
using namespace std;
using namespace Poco::Util;
typedef void (*Callback) (TimerTask&);
namespace Poco {
namespace Util {
class ProceduralTimerTaskAdapter : public TimerTask {
public:
ProceduralTimerTaskAdapter (Callback procedure); // Constructor
void run (); // Method defining the main thread
protected:
~ProceduralTimerTaskAdapter (); // Destructor (not for general use)
private:
ProceduralTimerTaskAdapter (); // Default constructor (not for general use)
Callback procedure; // The callback procedure called by the timer.
};
}
}
#endif
ProceduralTimerTaskAdapter.cpp:
// This is the implementation of the ProceduralTimerTaskAdapter class.
#include <iostream>
#include <Poco/Util/Timer.h>
#include <Poco/Util/TimerTask.h>
#include "ProceduralTimerTaskAdapter.h"
using namespace std;
using namespace Poco::Util;
ProceduralTimerTaskAdapter::ProceduralTimerTaskAdapter (Callback proc) :
TimerTask::TimerTask (),
procedure (proc)
{
}
ProceduralTimerTaskAdapter::~ProceduralTimerTaskAdapter ()
{
}
void ProceduralTimerTaskAdapter::run ()
{
procedure (*this);
}
开箱即用。不过,谢谢您的回答和评论!