Timer 如何使用静态C++方法作为POCO计时器的回调?

Timer 如何使用静态C++方法作为POCO计时器的回调?,timer,poco-libraries,Timer,Poco Libraries,我特别要说的是这个Poco类的构造函数: 我想在传统C++代码中使用它,其中大多数我编写的类是静态的,因此它们只包含静态方法和构造函数,只是因为我不需要这些对象的多个实例,而类只用于封装。是的,Poco建议添加一个回调方法,如下所示: TimerCallback<MyClass> callback(*this, &MyClass::onTimer); timer.start(callback); typedef void (*FunctionCallback)(TimerT

我特别要说的是这个Poco类的构造函数:

我想在传统C++代码中使用它,其中大多数我编写的类是静态的,因此它们只包含静态方法和构造函数,只是因为我不需要这些对象的多个实例,而类只用于封装。是的,Poco建议添加一个回调方法,如下所示:

TimerCallback<MyClass> callback(*this, &MyClass::onTimer);
timer.start(callback);
typedef void (*FunctionCallback)(TimerTask&);
TimerTaskAdapter(FunctionCallback func): _pObject(0), _method(0), _func(func){}
...
FunctionCallback _func;
我是否正确理解了这段代码片段:MyClass::onTimer也可能是MyClass的静态方法,但我还需要MyClass的当前实例,这样就可以简单地禁止未实例化的静态类的方法用作TimerCallback,还是我错了


谢谢。

我不会称之为禁止-函数回调只是没有实现,没有任何东西阻止您自己实现它并将其作为贡献发送回去,如果您愿意这样做的话

我只是扩展了,所以它不需要对象实例,例如:

TimerCallback<MyClass> callback(*this, &MyClass::onTimer);
timer.start(callback);
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);
}

在扩展TimerTaskAdapter时,遇到了一个与指向类成员的指针有关的更严重的问题,有人建议直接从TimerTask派生我的类:

请参阅以下源代码:

程序TimerTaskAdapter.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
过程TimerTaskAdapter.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);
}

它是开箱即用的。不过,感谢您的回答和评论

好的,我将制定一个类,它继承自TimerTaskAdapter,然后用您建议的方法覆盖原始适配器类的run方法,对吗?您可以这样做。由于更改是通用的,并且是值得添加到框架中的功能,因此您还可以修改TimerTaskAdapter并发送pull,其中包含将在未来版本中包含的更改。然后我将创建一个Poco.Util.Timer并计划TimerTask Adapter派生的一个实例,对吗?您不需要在用户端派生任何内容,只需将其包装在适配器中:TimerTask::ptrptask=newtimertaskadapter&YourClass::onTimer;timer.schedulepTask,time;-和以前一样,只是没有你想要的实例。我在脑子里打这个,但应该行得通。