正试图解决有关io_service对象的问题。问题代码如下:
void connect_handler(const error_code &ec,iterator iterator){
cout<<"Connect handler"<<endl;
}
void resolver_handler(const error_code &ec,iterator iterator,boost::asio::io_service &io){
cout<<"Resolver handler..."<<endl;
boost::asio::ip::tcp::socket socket(io);
boost::asio::async_connect(socket,iterator,&connect_handler);
}
int main(){
boost::asio::io_service io;
resolver resolver(io);
resolver::query query("example.com","http");
resolver.async_resolve(query,boost::bind(resolver_handler,boost::asio::placeholders::error,boost::asio::placeholders::iterator,boost::ref(io)));
cout<<io.run()<<endl;
return 0;
}
在另一个简单示例中尝试了相同的事情,一切都按预期运行:
void printTwo(const error_code& ec,boost::asio::deadline_timer &timer,boost::asio::io_service &io){
cout<<"print two"<<endl;
}
void printOne(const error_code& ec,boost::asio::deadline_timer &timer,boost::asio::io_service &io){
cout<<"print one"<<endl;
timer.async_wait(boost::bind(printTwo,boost::asio::placeholders::error,boost::ref(timer),boost::ref(io)));
}
int main(int argc, char** argv) {
boost::asio::io_service io;
boost::asio::deadline_timer timer(io,boost::posix_time::seconds(3));
timer.async_wait(boost::bind(printOne,boost::asio::placeholders::error,boost::ref(timer),boost::ref(io)));
cout<<io.run()<<endl;
return 0;
}
我的假设是服务对象将阻塞,直到完成所有工作为止。调用run函数的线程也是调用处理函数的线程。那么,为什么第二个代码块按预期工作,而不是第一个代码块工作?预先感谢。
答案 0 :(得分:0)
@table(name = "Stores")
public class Store extends SugarRecord<Store> {
}
将在io.run()
认为已完成其必须完成的工作后立即返回。这可能发生在之间操作之间,或者可能是在调用最后一个异步回调时(我不确定)。
使用work
object通知io_service
继续运行,当您重置该工作对象时,io_service
的{{1}}调用应在执行完毕后返回任何待处理的操作。
基本用法如下:
io_service
通常在另一个线程或异步回调之一中,您可以这样做:
run()
稍后,boost::asio::io_service io_service;
boost::asio::io_service::work work(io_service);
// ...
io_service.run(); // Blocks here
将返回。