ブースト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;
ありがとうございました。これは私に問題を解決する方法を示しました。キャンセルされたタイマーと期限切れのタイマーを区別したいので、私はエラーコードを渡す必要があります(上記ハンドラーの引数を参照してください)。このトピックの説明は、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 –