boost :: asio ioservice保持我的其余代码运行

时间:2015-10-27 13:32:33

标签: c++ qt boost boost-asio

我已经创建了一个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。

1 个答案:

答案 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);