2012-03-19 9 views
1

ブーストdeadline_time(メンバー) のハンドラをstatic宣言して作成できました。残念ながら、これは非静的メンバーデータへのアクセスを防ぎます。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_.async_wait(bind(&client::check_deadline, this));boost::bindを使用して、非静的データとdeadline_timerクラスを使用することが可能です。 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 –

0

私は一連のタイムアウトがあります。だから私の考えは、タイムアウトイベントの順序付きリストを維持しながら、単一の のdeadline_timerを持つことでした。 次のタイムアウトイベントが発生するたびに、クラス は、このタイムアウトイベントの残り時間を計算するクラス の次のタイムアウトイベントでタイマーを再トリガーします。

これは非常に奇妙なデザインです。

このコンセプトを処理するには、ハンドラは 非静的データを操作する必要があります。しかし、これは可能ではありませんboost :: asioは 静的ハンドラが必要です。

boost :: asioは静的ハンドラを必要としません。documentationを参照してください。ここは典型的なレシピは、ハンドラにメンバ関数をバインドするboost::bindを使用することですsignature

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

handlerが必要です。 async TCP client exampleにはこれを行う方法の1つが示されています。あなたがそれを理解できない場合、asioライブラリの作者はexcellent blog postを持っています。

+0

こんにちはサム、なぜこのデザインが奇妙だと思うか説明してください。 –

+0

@マイケル私の答えの残りの部分はあなたのデザインが奇妙な理由を説明していますが、そうでない場合にハンドラが静的である必要があると仮定しました。 –

関連する問題