2012-03-19 52 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

相關問題