我已经创建了一个 Windows 应用程序,我在其中使用了一些 QT Gui 来显示一个小部件,所以现在我想添加 boost::asio 异步 TCP 代码来接收数据并将数据发送到另一个应用程序。
当我在 main() 中编写以下代码时,会发生这种情况
//Code to initialize QT widgets and working fine.
try
{
boost::asio::io_service io_service;
server s(io_service, 8888); //8888 is a port no.
io_service.run(); // **Even after successfull creation it doesn't look for incoming data**
}
catch(std::exception& e)
{
std::cout << "Exception : " << e.what() << std::endl;
}
//rest of the code for qt widget, which will be blocked by io_service.
我也尝试过 poll() 来避免这种情况,但它也不会等待任何传入数据。
有什么方法可以同时实现这两个目标吗?
问候, 吉珊德拉。
最佳答案
io_service
需要一个自己的线程来不阻塞其他操作。此外,不是在 run()
上启动线程,而是有一个名为 boost::asio::io_service::work
的对象确保 run()
总是被执行,即使它返回。
下面是我通常如何实现 io_service 来运行:
IoServiceWork.h:
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
class IoServiceWork
{
public:
IoServiceWork()
: m_ioService(new boost::asio::io_service()),
m_ioServiceWork(new boost::asio::io_service::work(*m_ioService)),
m_ioWorkThread(new boost::thread(boost::bind(&boost::asio::io_service::run, m_ioService)))
{
}
~IoServiceWork()
{
delete m_ioServiceWork;
m_ioWorkThread->join();
delete m_ioWorkThread;
delete m_ioService;
}
boost::asio::io_service& ioService()
{
return *m_ioService;
}
boost::asio::io_service* m_ioService;
boost::asio::io_service::work* m_ioServiceWork;
boost::thread* m_ioWorkThread;
};
然后我使用此函数从我的项目的任何 .cpp 文件访问我的静态全局 io_service 对象。
CustomIOService.h:
#include <boost/asio.hpp>
boost::asio::io_service& IOService();
CustomIOService.cpp:
#include "IoServiceWork.h"
boost::asio::io_service& IOService()
{
static IoServiceWork ioServiceWork;
return ioServiceWork.ioService();
}
它作为静态对象放在函数中以避免静态初始化顺序失败。
那么,您需要做的就是创建您的套接字,或任何需要 io_service 对象的对象,例如您的服务器:
#include <CustomIoService.h>
server s(IOService(), 8888);
关于c++ - boost::asio io_service 保留我的其余代码运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33369388/