Boost asio チュートリアルのステップ 3 を永久に実行するように調整し、カウンターの代わりに「tick」と「tock」を 1 秒に 1 回表示します。
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
void print(const boost::system::error_code& /*e*/,
boost::asio::deadline_timer* t, int* count)
{
if( !((*count) % 2) )
std::cout << "tick\n";
else
std::cout << "tock\n";
++(*count);
t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
t->async_wait(boost::bind(print,
boost::asio::placeholders::error, t, count));
}
int main()
{
boost::asio::io_service io;
int count = 0;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
t.async_wait(boost::bind(print,
boost::asio::placeholders::error, &t, &count));
io.run();
std::cout << "Final count is " << count << "\n";
return 0;
}
今、標準入力でキープレスを非同期に処理できるようにしたいと考えています。スリープや待機をブロックせずに、キープレスに応答するために使用できる io_service ハンドラはありますか?
たとえば、次のようなハンドラ関数を実装できるようにしたいと考えています。
void handle_keypress(const boost::error_code&,
char c)
{
std::cout << "Tap '" << c << "'\n";
}
そして、このハンドラーの呼び出しは、次のようなものになると思います。
char c = 0;
boost::asio::stdin_receiver sr(io);
st.async_wait(boost::bind(handle_keypress, boost::asio::placeholders::error, &c));
io.run();
これは、組み込みのサービス ハンドラを使用するか、独自のサービス ハンドラを作成することによって、asio でできることですか?
編集、詳細:
私はこの質問を見てきましたが、受け入れられた回答のリンク先コードは単にこれを次のように行いmain
ます:
while (std::cin.getline(
私が作成しているアプリケーションは、上で概説したこの単純なチクタク タップ ギズモではなく、マルチキャスト サーバーになります。いくつかのワーカー スレッドは、パケットをマルチキャスト グループに送信し、メイン スレッドからのメッセージに応答し、メッセージをメイン スレッドに送り返します。次に、アプリケーションは stdin からの入力によって「駆動」されます。たとえば、ユーザーが「P」キーを押すと、マルチキャスト ブロードキャストが一時停止され、「Q」キーを押すと、すべてがシャットダウンします。 . メイン スレッドでは、これらの入力に応答してワーカー スレッドにメッセージを送信するだけです。
上記のwhile
ループは、ユーザーからの stdin 入力を待機している間、メイン スレッドがワーカー スレッドからのメッセージを処理できないため、私のシナリオでは機能しません。ワーカー スレッドからのこれらのメッセージの一部は、stdout への出力を生成します。