- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
boost::asio::steady_timer 在可执行文件中启动时工作正常。通过启动 DLL 中的 steady_timer,计时器立即到期。我的代码有什么问题?它是 boost::asio 中的错误吗?
api.h:
#include <boost/asio.hpp>
class my_api {
public:
virtual void startTimer(boost::asio::io_service& ioservice) = 0;
virtual ~my_api() {};
};
Dll.cpp:
#include <iostream>
#include <boost/dll.hpp>
#include "api.h"
class my_plugin : public my_api {
public:
void startTimer(boost::asio::io_service& ioservice) {
std::cout << "start timer (15 sec)\n";
boost::asio::steady_timer timer{ ioservice, std::chrono::seconds{ 15 } };
timer.async_wait([](const boost::system::error_code &ec) { std::cout << "15 sec\n"; });
};
~my_plugin() {};
};
static boost::shared_ptr<my_api> createPlugin() {
return boost::shared_ptr<my_api>(new my_plugin());
}
BOOST_DLL_ALIAS(
createPlugin,
create_plugin
)
main.cpp :
#include <boost/dll/import.hpp>
#include <boost/function.hpp>
#include <boost/asio.hpp>
#include <iostream>
#include "../DLL/api.h"
int main() {
boost::asio::io_service ioservice;
/* load dll */
boost::filesystem::path shared_library_path("..\\Debug");
shared_library_path /= "DLL";
boost::function<boost::shared_ptr<my_api>()> creator = boost::dll::import_alias<boost::shared_ptr<my_api>()>(
shared_library_path,
"create_plugin",
boost::dll::load_mode::append_decorations
);
boost::shared_ptr<my_api> plugin = creator();
/* set timer 10 sec */
std::cout << "start timer (10 sec)\n";
boost::asio::steady_timer timer{ ioservice, std::chrono::seconds{ 10 } };
timer.async_wait([](const boost::system::error_code &ec) { std::cout << "10 sec\n"; });
/* create my_plugin in dll with timer 15 sec */
plugin->startTimer(ioservice);
ioservice.run();
return 0;
}
输出:
start timer (10 sec)
start timer (15 sec)
15 sec
10 sec
在 DLL 中调用了 15 秒计时器并立即到期。在可执行文件中调用了 10 秒计时器并且工作正常。
我正在使用 Visual Studio 2017 V15.5.2。
最佳答案
这不是错误,在您的 startTimer
方法中,您创建了 steady_timer
对象并调用了 asyncWait
方法,但此方法立即返回(请参阅引用资料http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/reference/basic_waitable_timer/async_wait.html ),所以定时器对象被删除并调用处理程序(然后打印 15 秒)。您应该检查 ec
变量的值,它可能表明操作已中止。
在 main 函数中计时器对象起作用,因为程序正在等待这一行
ioservice.run();
因此可以在 10 秒后调用处理程序。
关于c++ - boost::asio::steady_timer 在 boost::dll 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47976296/
我使用独立的 asio 编写了一个异步 SSL 套接字实现,并且在服务器重置/关闭连接后努力让它重新连接。我是 asio 库的新手,所以请多多包涵。 由于 steady_timer,调用 io_con
我可以通过以下方式使用 stackful coroutine 和 boost::asio::steady_timer::async_wait 吗?关键是(我的理解,不确定)在等待期间,局部变量 tim
这个问题的灵感来自 boost asio 文档 (link) 中关于异步定时器的教程。代码略作修改,效果更明显。 有一个相关的问题,Multiple async_wait from a boost A
从运行时的角度来看,以下两个程序是相同的,都等待 5 秒以继续。一个用boost::asio::steady_timer,一个用sleep(),哪个更好? 1) 使用 sleep () $ cat b
我想转这个电话: timer.async_wait(handler); 进入这个电话: func(handler); 所以我尝试使用 std::bind: #include #include #i
boost::asio::steady_timer 在可执行文件中启动时工作正常。通过启动 DLL 中的 steady_timer,计时器立即到期。我的代码有什么问题?它是 boost::asio 中
使用 asio 库,我想为 asio::serial_port 读/写调用使用超时。 是否可以使用相同的 asio::serial_port asio::io_context 和用于 asio 的相同
我陷入了我的第一个asio代码中。我已经从官方网站(https://www.boost.org/doc/libs/1_73_0/doc/html/boost_asio/tutorial/tuttime
我是一名优秀的程序员,十分优秀!