使用std :: bind将QTimer :: singleShot传递给std :: async

时间:2018-05-08 22:42:29

标签: c++ qt c++11 stdbind

以下代码启动一个非阻塞计时器,它将在一秒钟后启动函数myFunc

MyClass.h:

std::future<void> timer_future_;

MyClass.cpp:

timer_future_ = std::async(

        std::launch::async,
        [this] { QTimer::singleShot(1000,
                                    [this] {this->myFunc();}
                                    );
               }
    );

我想用std::function替换lambda函数。我已经成功地替换了第二个lambda,如下所示:

timer_future_ = std::async(

        std::launch::async,
        [this] { QTimer::singleShot(1000, 
                                    std::bind(&MyClass::myFunc, this)
                                    );
               }
    );

我现在如何用另一个std::bind()电话替换第一个lambda?

注意函数QTimer::singleShot来自Qt库;其文件是here。它的原型是:

void QTimer::singleShot(int msec, Functor functor)

根据this question,可以在QObject.h中找到Functor类型的定义。它说:

template <class FunctorT, class R, typename... Args> class Functor { /*...*/ }

经过一些研究,我了解到将取代第一个lambda的std::bind()必须考虑以下因素:

我做了几次不成功的尝试,最后一次是:

timer_future_ = std::async(
        std::launch::async,
        std::bind( ( void(*) (int, Functor<const std::function<void(void)>,void>) )&QTimer::singleShot,
                  1000,
                  std::bind(&MyClass::myFunc, this)
                  )
);

对于此代码,MSVC编译器返回错误消息

error: C2059: syntax error: ')'

在第三行。

为什么我不使用已经工作的lambdas?答案很简单,试图使用std :: bind()代替我教会我更多关于C ++的各种功能语言以及如何使用它们。

编辑:实施Kuba Ober答案的代码:

QTimer::singleShot(1000, [this] {
    timer_future_ = std::async(
                std::launch::async,
                std::bind(&MyClass::myFunc, this)
                );
});

2 个答案:

答案 0 :(得分:0)

计算左右括号并添加分号

答案 1 :(得分:0)

计时器需要一个事件循环,std::async将在没有运行事件循环的工作线程中调用它。我怀疑你为什么要这么做?

如果要在延迟后在工作线程中运行某些东西,请在具有事件循环的线程中运行计时器,然后从该计时器触发异步操作。