gpt4 book ai didi

multithreading - 用Qt增强asio

转载 作者:行者123 更新时间:2023-12-03 12:54:49 26 4
gpt4 key购买 nike

我正在尝试将boost::asio async client example与简单的Qt GUI一起使用:

enter image description here

我的应用程序中的一些摘要:

按钮单击SLOT:

void RestWidget::restGetCall()
{

networkService ntwkSer("www.boost.org","80");
connect(&ntwkSer, SIGNAL(responseReady(std::string)), this, SLOT(showResponse(std::string)));
ntwkSer.get("/LICENSE_1_0.txt");

}

networkService类只是上述链接的boost示例代码的包装。它是从QObject类派生的,用于信号,插槽机制。
void networkService::get(const std::string & path)
{
// boost::thread (boost::bind(&networkService::networkCall,this,path));//this gives me sigabrt
networkCall(path);//this works fine, and i get output as pictured above.
}

void networkService::networkCall(const std::string path)
{
tcp::resolver::query query(host_, port_);//also these host,port fields come out to be invalid/garbage.
//tcp::resolver::query query("www.boost.org","80");//still doesnt resolve the SIGABRT
resolver_.async_resolve(query,
boost::bind(&networkService::handle_resolve, this,
boost::asio::placeholders::error,
boost::asio::placeholders::iterator,
path));
io_service.run();
}

问题是,当我从boost::thread运行io_service.run()时。我得到SIGABRT。

在调试时,networkService::networkCall(path)函数中的host_,port_ networkService包装器类字段也无效,这些字段在构造时会保存:
networkService ntwkSer("www.boost.org","80");

boost::thread的明显原因是使GUI无阻塞,因为io_service()有其自己的事件循环。我的意图是在单独的boost线程中运行boost::asio异步调用,并使用QT的Q_OBJECT信号插槽机制通知GUI线程。

我没有得到SIGABRT的原因,也没有得到当我开始使用boost::thread时host_和port_的字段值变得无效的原因。

PS:相同的设置在类似的命令行应用程序(没有Qt GUI代码)中使用boost::thread时,也可以正常工作,即,当networkService类没有被Qt信号/插槽入侵时,可以通知主GUI线程。在这里,我从boost::thread中使用boost::asio的响应。

编辑:
根据对我问题的回答,我尝试了此操作...我禁用了networkservice类的Q_OBJECT信号/插槽和QObject派生,以确保MOC不会弄乱事情..但是,问题仍然存在,我在Windows上遇到访问冲突与sigabrt在Linux上。还出现了网络服务对象的字段损坏的问题,最终导致访问冲突。
实际上,行为没有变化。

在启动线程之前:
enter image description here
从内线程
enter image description here
继续访问冲突...
enter image description here

因此,即使没有MOC,问题仍然存在。

编辑2:
对不起,我感到很抱歉。我在boost::thread中使用本地networkService对象时犯了一个严重错误,该对象在线程实际运行时就超出了范围!

最佳答案

很难让asio io_service.run()函数在Qt事件循环中“发挥出色”。

使用调用Qtio_service::poll()io_service::poll_one()插槽,然后将该插槽连接到QTimerEvent会更容易。

而且,使用QNetworkAccessManager而不是asio甚至更容易,请参见Qt Client Example

关于multithreading - 用Qt增强asio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39481072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com