2012-03-19 89 views
1

我能够通过声明它为静态来创建处理程序以用于boost deadline_time(它是成员) 。不幸的是,这会阻止访问非静态成员数据。从处理程序获取类数据以进行boost deadline_timer

我有一系列的超时。所以我的想法是有一个deadline_timer ,同时保持超时事件的有序列表。 每次发生下一个超时事件时, 该类将重新触发该计时器,并使用类 中的下一个超时事件计算此超时事件的剩余时间。

对于这个概念的工作处理程序将需要操纵 非静态数据。但是这是不可能的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; 

回答

3

有可能使用deadline_timer类以下列方式使用deadline_.async_wait(bind(&client::check_deadline, this));boost::bind静态数据。 ASIO示例中提供了详细信息,例如,here

+0

非常感谢。这向我展示了如何解决这个问题。因为我想区分取消和过期的定时器,我需要传递错误代码(请参阅上面的处理程序的参数)。有关此主题的讨论,请参阅http://stackoverflow.com/questions/1918911/better-boost-asio-deadline-timer-example。所以我需要使用m_pTimer-> async_wait(boost :: bind(&TimerController :: timerHandler,this,_1))传递参数。请参阅http://stackoverflow.com/questions/4426802/boost-asio-async-wait-handler – 2012-03-19 21:31:51

0

我有一系列的超时。所以我的想法是在保持有序的超时事件列表的同时拥有一个单一的 deadline_timer。 每次发生下一次超时事件时,班级将用类中的下一个超时事件重新触发计时器,计算此超时事件的剩余时间。

这是一个非常奇怪的设计。

对于这个概念的工作处理器将需要操纵 非静态数据。但是这是不可能的提升:: asio需要一个 静态处理程序。

boost :: asio不需要静态处理程序,请参阅documentation。它需要与signature

void handler(
    const boost::system::error_code& error // Result of operation. 
); 

这里的典型配方是用boost::bind成员函数绑定到处理程序handlerasync TCP client example显示了一种方法来做到这一点。 asio图书馆的作者有一个excellent blog post详细描述这个概念,如果你无法理解它的话。

+0

的答案你好,萨姆,你能解释一下,你为什么认为这个设计很奇怪。 – 2012-03-19 20:27:27

+0

@Michael我的答案的其余部分解释了为什么你的设计很奇怪,你认为处理程序需要静态时,情况并非如此。 – 2012-03-19 20:54:54

相关问题