C++ boost::asio::稳定计时器不';无法在boost::dll中工作

C++ boost::asio::稳定计时器不';无法在boost::dll中工作,c++,boost,dll,asio,C++,Boost,Dll,Asio,boost::asio::Stadium_计时器在可执行文件中启动时工作正常。通过启动DLL中的稳定计时器,计时器将立即过期。我的代码有什么问题?它是boost::asio中的一个bug吗 api.h: #include <boost/asio.hpp> class my_api { public: virtual void startTimer(boost::asio::io_service& ioservice) = 0; virtual ~my_api()

boost::asio::Stadium_计时器在可执行文件中启动时工作正常。通过启动DLL中的稳定计时器,计时器将立即过期。我的代码有什么问题?它是boost::asio中的一个bug吗

api.h:

#include <boost/asio.hpp>

class my_api {
public:
   virtual void startTimer(boost::asio::io_service& ioservice) = 0;
   virtual ~my_api() {};
};
#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
)
#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
15秒计时器在DLL中被调用,并立即过期。在可执行文件中调用了10秒计时器,工作正常


我正在使用Visual Studio 2017 V15.5.2。

这不是错误,在您的
startTimer
方法中,您创建了
staddy\u timer
对象并调用了
asyncWait
方法,但该方法立即返回(请参阅参考资料),因此删除计时器对象并调用处理程序(然后打印15秒)。您应该检查
ec
变量的值,它可能表示操作已中止

在主函数中,计时器对象工作,因为程序正在这一行中等待

ioservice.run();

因此处理程序可以在10秒后调用。

只需使用
wait
而不是
async\u wait
?谢谢您的回答。您是对的:在dll中启动的计时器被取消。如何在ioservice以可执行方式处理的dll中创建计时器?我从未使用过boost dll,但如果要调用
async\u wait
方法,
timer
对象应该在调用
startTimer
方法后存在。你的类
my_plugin
可以存储成员,因此你可以将
stable_timer
定义为
my_plugin
类的成员,添加以
io_service
为参数的构造函数,在
my_plugin
对象的构造函数中,
stable_timer
io_service
初始化。然后在
startTimer
中,您可以设置到期时间并运行
async\u wait
方法。问题是,正如您所说,删除了计时器。现在它工作得很好。非常感谢你!