我已经创建了一个Windows应用程序,我已经使用了一些QT Gui来显示一个Widget,所以现在我想添加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()来避免这种情况,但它也没有等待任何传入的数据。
有没有办法同时实现这两个目标?
此致 Jithendra。
答案 0 :(得分:3)
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);