gpt4 book ai didi

c++ - 防止 boost 复制我的回调处理程序

转载 作者:太空宇宙 更新时间:2023-11-04 12:23:56 24 4
gpt4 key购买 nike

我使用boost::asio编写了一个小型tcp客户端,提供了以下功能:

typedef boost::function<void(const bs::error_code& errCode, size_t bytesTransferred)> ReadHandler;

void CTcpClient::AsyncRead2(std::vector<char>& data, size_t length, ReadHandler readCompletedCallback)
{
async_read(m_tcpData->socket, ba::buffer(data, length), readCompletedCallback);
}

我的想法是为我的 TcpClient 类的用户提供异步操作,而无需担心线程处理、io_services 等。

现在从我的单元测试类调用上述函数的代码如下所示:

CTestTcpClient header

class CTestTcpClient : public ::testing::Test
{
public:
CTestTcpClient(void);
virtual ~CTestTcpClient(void);

struct ReadCompletedHandler
{
ReadCompletedHandler() : m_isCompleted(false){};

void operator()(const boost::system::error_code& errCode, size_t bytesTransferred)
{
m_isCompleted = true; // my breakpoint here, checking this pointer
};

bool isCompleted(void)
{
return m_isCompleted;
}

private:
bool m_isCompleted;
};

ReadCompletedHandler m_readHandler;
};

CTestTcpClient 源码

TEST_F(CTestTcpClient, testAsynchronousRead_Success)
{
CTcpClient client(testService);
// Skipped code to setup echo server, connecting and sending of data
// Receive echo
vector<char> receiveBuffer(TESTDATA_SIZE);

client.AsyncRead2(receiveBuffer, TESTDATA_SIZE, m_readHandler);

while (!m_readHandler.isCompleted())
{
client.Wait(200);
}
}

现在问题来了:while 循环永远不会退出,因为 is_completed 标志是在 m_readHandler 的拷贝 中设置的。如果我在处理程序的 operator() 中设置断点,我可以检查并比较 this 指针。似乎 boost::asio 正在复制我的处理程序,在那里调用 operator(),然后返回。我原来的处理程序根本没有被碰过。

boost 文档说将根据需要制作处理程序的拷贝。所以这似乎没问题,但我该怎么做才能实现所需的行为?

感谢您的帮助

最佳答案

我用于完成处理程序的典型习语是 boost::bind 一个使用 boost::shared_from_this 的成员函数来确保所讨论的对象不会退出的范围。这在几乎所有 Boost.Asio examples 中都很普遍。

如果你不想改变你的设计,你可以尝试 boost::ref,例如:

client.AsyncRead2(receiveBuffer, TESTDATA_SIZE, boost::ref(m_readHandler) );

关于c++ - 防止 boost 复制我的回调处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3467059/

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