今朝、自販機で缶コーヒー買ったら
「おはようございます。お仕事頑張ってください!」って言われた。
おまえはハローワークの前に設置されてるって事を自覚しろ!
「いいね」ボタンは「いいね」する対象のサイトと無関係な所に貼っても動作する。 「クリックして世界の子供を救おう」とかいう画像の上に透明の「いいね」ボタンを置いて鬼畜系エロサイトに「いいね」させることもできるので、エロサイトに「いいね」しちゃった人をいじめるのはやめようね。
条件変数のタイムアウト付き待機関数を使うときに、落とし穴にはまらないようにラムダ式を使うとよさそう。
boost::asio 同期処理 タイムアウト
ソケット接続にタイムアウト時間を設定する
void connect() {
boost::asio::io_service io_service;
boost::asio::steady_timer timer(io_service);
boost::asio::ip::tcp::socket socket;
// 非同期で接続を行い、結果として指定された時間内に接続が完了しなければタイムアウトとする
timer.expires_from_now(boost::chrono::seconds(3));
boost::system::error_code ec = boost::asio::error::would_block;
boost::asio::async_connect(
socket,
/* resolver::iterator */,
[&ec](const boost::system::error_code& e, boost::asio::ip::tcp::resolver::iterator) -> void { ec = e; }
);
// 成否が出るまで待つ
do {
io_service.run_one();
} while (ec == boost::asio::error::would_block);
// 接続できたか判断する
if (ec || !socket.is_open()) {
// だめでした
}
}
シリアルポートを使い、デリミタまで読み込む処理にタイムアウト時間を設定する。
void read_until() {
boost::asio::io_service io_service;
boost::asio::steady_timer timer(io_service);
boost::asio::serial_port serial(io_service);
// タイムアウトを設定し、
// - 読み込めた場合はタイマーをキャンセルし、読み込めたことを通知する
// - そうでない場合はタイムアウト時間が経過するまで待ち、async_wait関数のハンドラで読み込み処理をキャンセルする
timer.expires_from_now(boost::chrono::seconds<span class="synConstant"></span>(3));
boost::asio::streambuf read_buffer;
std::size_t readSize;
boost::asio::async_read_until(
serial,
read_buffer,
"\r\n",
[&readSize, &timer](const boost::system::error_code& e, std::size_t size) -> void {
if(e || !size) {
// 何かしらエラーが起きた
readSize = 0;
return;
}
// デリミタまで読んだ
readSize = size;
timer.cancel(); // async_wait関数のハンドラ内でエラーを起こさせる
}
);
timer.async_wait(
[&serial](const boost::system::error_code& e) -> void {
if (e) {
// timeoutがキャンセルされた
return;
}
// timeout時間が経過した
serial.cancel();
}
);
// 非同期関数の呼び出しが完了するまで待つ
io_service.reset(); // *1
io_service.run();
// 確認
if (!readSize) {
// だめでした
}
}
*1 (2012-05-23追記)
This function must be called prior to any second or later set of invocations of the run(),
run_one(), poll() or poll_one() functions when a previous invocation of these functions
returned due to the io_service being stopped or running out of work.