gpt4 book ai didi

c++ - boost 异步操作不起作用(对我来说)

转载 作者:行者123 更新时间:2023-11-28 06:32:47 26 4
gpt4 key购买 nike

首先,这是我第一次使用boost::asio,也是第一次使用异步编程。所以,我对这两者都不熟悉。

基本上我想通过串行端口与机器人交互。为此,我正在使用 boost::asio::serial_port。我想做的其中一项操作是让机器人旋转几毫秒,但是是异步的,以免在其他处理过程中出现任何滞后。该类的内部结构如下:

class Robot
{
boost::asio::io_service is;
boost::asio::serial_port port;

...

public:

Robot(const std::string &visionDeviceAddress, const std::string &motorControlDeviceAddress)
:visionDevice(visionDeviceAddress), port(is), motorControlDevice(motorControlDeviceAddress)

...

void completePendingMotions()
{
is.run();
}
}

我相信以下功能应该可以完成这项工作:

void Robot::async_rotateLeftFor(unsigned long milliseconds)
{
boost::asio::deadline_timer t(is, boost::posix_time::milliseconds(milliseconds));
//the character 'a' initiates a non-stop anticlockwise rotation
char c='a';
boost::asio::write(port, boost::asio::buffer(&c,1));
t.async_wait([&](boost::system::error_code e)
{
//to stop the rotation, i need to pass the character 'q'
//this is done synchronously by function stop()
stop();
});
}

最后,main() 的调用如下所示:

int main(void)
{
Robot r("0","COM6");
r.connect();
r.async_rotateLeftFor(2000);
r.completePendingMotions();
return 0;
}

我得到的只是机器人连接已成功建立,它开始旋转,但随后不会停止,因为完成处理程序应该如此。我不知道可能是什么原因。缺少 asio 文档也无济于事。非常感谢任何帮助。

最佳答案

问题在于 deadline_timer 对象需要在处理程序触发之前保持事件状态,否则在调用 is.run() 时处理程序将立即被触发并出错。当 async_rotateLeftFor 函数退出时,计时器被销毁。

我为保持计时器所做的工作是将计时器对象包装在 shared_ptr 中并将其传递给处理程序对象。

void Robot::async_rotateLeftFor(unsigned long milliseconds) {   
auto t = std::make_shared<boost::asio::deadline_timer>(
is, boost::posix_time::milliseconds( milliseconds ));

//...

// (capture shared_ptr in lambda)
t->async_wait( [this,t](boost::system::error_code e )
{
stop();
}
);

关于c++ - boost 异步操作不起作用(对我来说),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27232202/

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