Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从boost-dudate\u计时器的处理程序访问类数据_C++_Boost_Boost Asio - Fatal编程技术网

C++ 从boost-dudate\u计时器的处理程序访问类数据

C++ 从boost-dudate\u计时器的处理程序访问类数据,c++,boost,boost-asio,C++,Boost,Boost Asio,我能够创建一个提升时间的处理程序(它是一个成员) 通过声明它是静态的。不幸的是,这阻止了对非静态成员数据的访问 我有一系列的暂停。所以我的想法是只设一个截止时间计时器 同时维护超时事件的有序列表。 每次发生下一个超时事件时, 类将使用类中的下一个超时事件重新触发计时器 正在计算此超时事件的剩余时间 为了使这个概念起作用,处理程序需要进行操作 非静态数据。但这是不可能的,因为sence boost::asio需要一个静态处理程序 有人知道怎么处理吗 class TimerController {

我能够创建一个提升时间的处理程序(它是一个成员) 通过声明它是静态的。不幸的是,这阻止了对非静态成员数据的访问

我有一系列的暂停。所以我的想法是只设一个截止时间计时器 同时维护超时事件的有序列表。 每次发生下一个超时事件时, 类将使用类中的下一个超时事件重新触发计时器 正在计算此超时事件的剩余时间

为了使这个概念起作用,处理程序需要进行操作 非静态数据。但这是不可能的,因为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;
类时间控制器{
公众:
无效设置计时器(常数eibaddr\u t gad,常数timesecs\u t timedelay);
无效取消计时器(const eibaddr\u t gad);
布尔正在运行(const Eibadr_t gad);
无效设置(const eibaddr_t gad);
静态void timerHandler(const boost::system::error\u code&ec);
私人:
boost::asio::deadline\u timer*m\u optimer;
结构时间列表
{
艾巴德尔加德;
boost::posix_time::ptime absTimeOut;
timerList_s(const timerList_s&elem):gad(elem.gad),
absTimeOut(元素absTimeOut)
{
};
时间列表(const-eibaddr\u t&pgad,const-boost::posix\u-time::ptime-pato)
:gad(pgad),
absTimeOut(帕托)
{
};
timerList_s&operator=(常数timerList_s&elem)
{
gad=元素gad;
absTimeOut=元素absTimeOut;
归还*这个;
};
布尔运算符<(常数时间列表)常数
{
返回(absTimeOut<元素absTimeOut);
};
布尔运算符==(常数时间列表\u s&elem)常数
{
收益(总收益==要素总收益);
};
};
标准:列出m_定时器;

可以使用
boost::bind
deadline\u timer
类与非静态数据一起使用,方法如下
deadline\u.async\u wait(bind(&client::check\u deadline,this));
。例如,ASIO示例中提供了详细信息

我有一系列的休息时间,所以我的想法是有一个单人间 在维护超时事件的有序列表的同时,设置截止时间计时器。 每次发生下一个超时事件时,类都会 使用类中的下一个超时事件重新触发计时器 正在计算此超时事件的剩余时间

这是一个非常奇怪的设计

为了使这个概念起作用,处理程序需要进行操作 非静态数据。但这是不可能的。sence boost::asio需要 静态处理程序

asio不需要静态处理程序,请参阅。它需要带有


这里的典型方法是使用
boost::bind
将成员函数绑定到处理程序。说明了一种方法。asio库的作者有一篇文章详细描述了这个概念,如果你理解它有困难。

Hi Sam,你能解释一下,为什么你认为这个设计很奇怪。@Michael我回答的其余部分解释了为什么你的设计是奇怪的,你假设处理程序需要是静态的,而事实并非如此。非常感谢。这向我展示了如何解决这个问题。由于我想区分已取消和过期的计时器,我需要传递错误代码(见上面我的处理程序的参数)。有关此主题的讨论,请参阅。因此,我需要使用m_pTimer->async_wait(boost::bind(&TimerController::timerHandler,this,_1))传递参数。请参阅的答案
void handler(
  const boost::system::error_code& error // Result of operation.
);