我能够为boost deadline_time(这是一个成员)创建一个处理程序 通过声明它是静态的。不幸的是,这会阻止访问非静态成员数据。
我有一系列超时。所以我的想法是有一个deadline_timer 同时保持有序的超时事件列表。 每次下次超时事件发生时, 该类将使用类中的下一个超时事件重新触发计时器 计算此超时事件的剩余时间。
要使这个概念起作用,处理程序需要进行操作 非静态数据。但这不可能是sence boost :: asio需要一个静态处理程序。
有人知道如何处理这个问题吗?
class TimerController {
public:
void setTimer(const eibaddr_t gad, const timesecs_t timedelay);
void cancelTimer(const eibaddr_t gad);
bool isRunning(const eibaddr_t gad);
void setGad(const eibaddr_t gad);
static void timerHandler(const boost::system::error_code &ec);
private:
boost::asio::deadline_timer* m_pTimer;
struct timerList_s
{
eibaddr_t gad;
boost::posix_time::ptime absTimeOut;
timerList_s(const timerList_s& elem) : gad(elem.gad),
absTimeOut(elem.absTimeOut)
{
};
timerList_s(const eibaddr_t& pgad, const boost::posix_time::ptime pato)
: gad(pgad),
absTimeOut(pato)
{
};
timerList_s& operator= (const timerList_s& elem)
{
gad = elem.gad;
absTimeOut = elem.absTimeOut;
return *this;
};
bool operator< (const timerList_s& elem) const
{
return (absTimeOut < elem.absTimeOut);
};
bool operator== (const timerList_s& elem) const
{
return (gad == elem.gad);
};
};
std::list<timerList_s> m_timers;
答案 0 :(得分:3)
可以使用deadline_timer
以boost::bind
的方式使用deadline_.async_wait(bind(&client::check_deadline, this));
类使用{{1}}。 ASIO示例中提供的详细信息,例如here。
答案 1 :(得分:0)
我有一系列超时。所以我的想法是有一个 deadline_timer,同时维护有序的超时事件列表。 每次下次超时事件发生时,类都会 使用类中的下一个超时事件重新触发计时器 计算此超时事件的剩余时间。
这是一个非常奇怪的设计。
要使这个概念起作用,处理程序需要进行操作 非静态数据。但这不可能是sence boost :: asio需要一个 静态处理程序。
boost :: asio不需要静态处理程序,请参阅documentation。它需要handler和signature
void handler(
const boost::system::error_code& error // Result of operation.
);
这里的典型配方是使用boost::bind
将成员函数绑定到处理程序。 async TCP client example显示了一种方法。 asio库的作者有excellent blog post详细描述了这个概念,如果你无法理解它。