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

时间:2018-09-01 21:46:25

标签: timer poco-libraries

我特别是在谈论这个Poco类的构造函数:Poco.TimerCallback

我想在遗留的C ++代码中使用它,因为我编写的大多数类都是“静态”的,因此它们只包含静态方法而没有构造函数,仅因为我始终不需要此类对象的多个实例,这些类仅用于封装。是的,Poco伙计们建议添加这样的回调方法:

TimerCallback<MyClass> callback(*this, &MyClass::onTimer);
timer.start(callback);

我是否正确理解了以下代码段:MyClass::onTimer也可能是MyClass的静态方法,但是我还需要MyClass的当前实例,因此静态类的方法,哪些没有实例化,只是被禁止用作TimerCallback,还是我错了?

谢谢。

2 个答案:

答案 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);
}

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