我想使用boost::asio(或独立于asio)每分钟通过异步套接字查询多个网络设备以获取数据。为了进行测试,我已经实现了Client类和一个控制台程序,该程序可以在一台设备上执行该操作(无重复)。
像这样的东西:
class MyClient
{
public:
MyClient(asio::io_service& io_service);
void GetData(CompletionHandler completionHandler);
};
MyClient::GetData类在内部使用多个异步操作,其中每个操作的完成都会触发下一个操作,直到数据可用为止:
使用此类的控制台程序的工作原理如下:
int main(...)
{
asio::io_service io_service_;
MyClient c(io_service_, ...);
...
c.GetData([](std::error_code ec, const FloatVector& values){
//do something with values
});
io_service_.run();
...
}
现在,我想在GUI程序中使用MyClient类每分钟一次连接到10台以上的设备,但是我在总体设计上陷入了困境。
首先,我创建了一个线程池,其中每个线程都执行单个io_service实例的io_service::run()。
现在,只要我的程序想要从设备读取数据,它就会在所有设备上循环,并且必须为每个设备创建MyClient实例并调用GetData()方法。
现在在池的线程中执行了io_service::run()之后,它如何与io_service一起使用?我可以简单地在GUI线程中调用MyClient::GetData(),因为它在内部使用异步操作,还是必须调用io_service::post()之类的东西?
更新:
我的代码和控制台演示大致遵循以下示例:
www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/example/http/client/async_client.cpp
但是在GUI程序中,我不想在GUI线程中运行io_service.run()。现在假设我至少有一个额外的线程执行io_service.run(),并且用户按下了应该开始读取设备的按钮。最终完成处理程序应将数据存储在数据库中,并向用户更新图形显示。
也许按钮处理程序可以简单地实例化MyClient并在其上调用GetData(),并且一切正常,因为MyClient知道io_service并使用它。在async_connect等中
像这样工作还是我在这里弄错了?
注意:这时我的问题不是如何在完成处理程序中处理数据!这是在多线程GUI程序中正确获取数据的方法。
最佳答案
以下是您需要做什么的粗略概述: