この難しさは、どこから来るか?と言うと、キューに溜まっている deadline_timer の処理と、通常の送受信ハンドラの処理順序を制御する事ができないところからきます。通信が正常に終了した場合には、deadline_timer のハンドラが残っていますし、キャンセル処理した場合には、これに加えて通常のハンドラがキャンセルされてコールされます。キャンセル時のハンドラの処理順序は規格上不定です。
よって、気持ちの悪い enable_shared_from_this を利用します。
tr1 だと memory、boost だと enable_shared_from_this.hpp なのでしょうか…。クラスをmixin(侵入継承?)させます。
class hoge : public enable_shared_from_this<hoge> {
...
};
としておいてから、ハンドラの登録時に
boost::bind( // tr1::bind
&hoge::handle_wrote,
shared_from_this(),
boost::asio::placeholders::error
)
とハンドラを指定します。
・・・続く
0 件のコメント:
コメントを投稿