gpt4 book ai didi

c++ - 回调类成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:36 25 4
gpt4 key购买 nike

我正在尝试构建一个非常简单的调度程序。它允许将任务(功能)添加到列表中并按设定的时间间隔运行。如果我提供静态函数作为其“ScheduleTask”成员的参数,则“Scheduler”类可以正常工作。

class TestController
{
private:
Scheduler _scheduler;

public:
TestController(void)
{
_scheduler.ScheduleTask(Task1, 3000);
_scheduler.ScheduleTask(Task2, 5000);
}
~TestController(void);

void Task1(void) { }
void Task2(void) { }
};

struct Task
{
long interval;
long last_run;
void (*TaskCallback) (void);

Task()
{
last_run = 0;
}
};

class Scheduler
{
private:
std::vector<Task> _tasks;
public:
Scheduler(void) { }
~Scheduler(void) { }

void ScheduleTask(void (*TaskCallback) (void), long interval)
{
Task t;
t.TaskCallback = TaskCallback;
t.interval = interval;
_tasks.push_back(t);
}

void loop()
{
for(unsigned int i = 0; i < _tasks.size(); i++)
{
long elapsed = clock();

if(elapsed - _tasks[i].last_run >= _tasks[i].interval)
{
_tasks[i].last_run = elapsed;
_tasks[i].TaskCallback();
}
}
}

};

如何修改回调以接受已实例化的“TestController”对象上的成员?

最佳答案

结合使用 boost::functionboost::bind。或者,如果您的编译器支持,请使用 std::functionstd::bind

#include <boost/bind.hpp>
#include <boost/function.hpp>

#include <vector>

typedef boost::function<void()> Callback;

struct Task
{
long interval;
long last_run;
Callback TaskCallback;

Task()
{
last_run = 0;
}
};

class Scheduler
{
private:
std::vector<Task> _tasks;
public:
Scheduler(void) { }
~Scheduler(void) { }

void ScheduleTask(const Callback& TaskCallback, long interval)
{
Task t;
t.TaskCallback = TaskCallback;
t.interval = interval;
_tasks.push_back(t);
}

void loop()
{
for(unsigned int i = 0; i < _tasks.size(); i++)
{
long elapsed = clock();

if(elapsed - _tasks[i].last_run >= _tasks[i].interval)
{
_tasks[i].last_run = elapsed;
_tasks[i].TaskCallback();
}
}
}
};

class TestController
{
private:
Scheduler _scheduler;

public:
TestController(void)
{
_scheduler.ScheduleTask(boost::bind(&TestController::Task1,this), 3000);
_scheduler.ScheduleTask(boost::bind(&TestController::Task2,this), 5000);
}
~TestController(void);

void Task1(void) { }
void Task2(void) { }
};

关于c++ - 回调类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904941/

25 4 0