我已将Boost asio 教程的第 3 步改编为永远运行,并每秒显示一次“tick”和“tock”而不是计数器:
#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 做的事情吗,要么使用内置的服务处理程序,要么自己编写?
编辑,详细说明:
我已经看到了这个问题,但是accepted answer中的链接到代码只是这样做main
:
while (std::cin.getline(
我正在编写的应用程序不是我上面概述的这个简单的滴答滴答小玩意儿,而是一个多播服务器。几个工作线程将向多播组发送数据包,响应来自主线程的消息,并将消息发送回主线程。反过来,应用程序将由来自标准输入的输入“驱动”——例如,当用户按下“P”键时,多播广播将暂停,当按下“Q”时,整个事情将关闭. 在主线程中,我对这些输入的响应就是向工作线程发送消息。
上面的while
循环在我的场景中不起作用,因为在等待用户的标准输入输入时,主线程将无法处理来自工作线程的消息。来自工作线程的一些消息将生成输出到标准输出。