Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::asio::deadline\u计时器实现通用计时器类时出现问题_C++_Boost - Fatal编程技术网

C++ 使用boost::asio::deadline\u计时器实现通用计时器类时出现问题

C++ 使用boost::asio::deadline\u计时器实现通用计时器类时出现问题,c++,boost,C++,Boost,在UI应用程序上实现计时器类 基本上,我遇到的问题是调用io.run()会阻塞,导致async\u wait调用无效。通过阅读其他帖子,我得到了这样的印象:不知何故,计时器,或者至少调用startCountdown的代码,应该在另一个线程上 下面是我的代码。如何以Boost中认为正确的方式管理此问题 class Timer { public: Timer() : countdownTimer(io) { } void startCountdown(int seconds)

在UI应用程序上实现计时器类

基本上,我遇到的问题是调用
io.run()
会阻塞,导致
async\u wait
调用无效。通过阅读其他帖子,我得到了这样的印象:不知何故,计时器,或者至少调用
startCountdown
的代码,应该在另一个线程上

下面是我的代码。如何以Boost中认为正确的方式管理此问题

class Timer
{
public:

    Timer() : countdownTimer(io) {  }

    void startCountdown(int seconds)
    {
        countdownTimer.expires_from_now(boost::posix_time::seconds(seconds));
        countdownTimer.async_wait(boost::bind(&Timer::on_timeout, this, _1));
        io.run(); // this blocks
    }

    void on_timeout(const boost::system::error_code& e)
    {
        if (e != boost::asio::error::operation_aborted) {
            cout << "Timer expired!";
        }
    }

private:

    boost::asio::io_service io;
    boost::asio::deadline_timer countdownTimer;
}
类计时器
{
公众:
计时器():倒计时(io){}
无效开始计数(整数秒)
{
倒计时。从现在起过期(boost::posix_time::seconds(秒));
异步等待(boost::bind(&Timer::on_timeout,this,_1));
io.run();//此块
}
超时时无效(const boost::system::error\u code&e)
{
如果(e!=boost::asio::error::operation\u中止){

cout您不应调用
io_服务的
run
成员函数,但rahter应调用以下函数之一:

取决于您的设计目标

还要注意的是,
boost-Asio
并不是真正设计为用于某些功能的辅助库,而是作为程序的核心元素,它更像是一个脊椎而不是手臂


一个专用于处理与io_服务相关的所有内容的线程也可以工作,但在同步和异步世界之间同步共享数据是否好运取决于:)

但粗略估计,io服务需要有自己的线程。不过,对于一个简单的计时器,有更好的替代方案吗?我最终移动了代码在
startCountdown
中,到另一个线程,这似乎很有效。@AldrichCo AFAIK如果你想异步使用
asio
的计时器,你必须在某个地方运行
io\U服务,如果它不是你的应用程序核心结构的一部分,我想它必须在后台。