我想使用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一起工作,现在io_service::run()在池的线程中执行?我可以直接在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并在异步连接等方面使用它。
是这样工作的还是我在这里弄错了?
注意:此时我的问题不是如何处理完成处理程序中的数据!正确获取多线程GUI程序中的数据是我的问题。