c++ - boost::asio io_service 保留我的其余代码运行

标签 c++ qt boost boost-asio

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

相关文章:

c++ - 将指针附加到 QList

c++ - 字符串到 float 的转换和格式化

c++ - 共享首选项实现

c++ - 从 Boost 二项分布中抽取随机数

C++:传递 "typedef"定义的类作为参数

c++ - 如何检查和处理前提条件违规?

c++ - ID_BUTTON 未使用常量表达式初始化

c++ - 如何在 Qt 应用程序中获取 SD 卡的总空间和已用空间?

c++ - 对 boost::smart_ptr 的引用指向对象并检查它们的有效性

c++ - 从 child 到 parent 的转换不允许静态转换