在c ++ 11中以周期性的时间间隔调用类成员函数

时间:2015-02-25 17:29:36

标签: multithreading c++11 visual-studio-2013 timer

让我们有一个类,它创建一个线程并让我们运行一个无限循环来检查一个que。在这个线程中,我想定期调用类的一个函数(处理来自que的累积数据,例如每100毫秒)。

我已经组装了一个基于aswers的计时器 https://stackoverflow.com/a/14665230/1699328https://stackoverflow.com/a/21058232 但是,我不知道,如何从对象中调用一个函数,从而创建了该线程。计时器如下:

#include <thread>

class TimerSimpleInfinite
{
public:
    template <class callable, class... arguments>
    TimerSimpleInfinite(int interval, callable&& f, arguments&&... args)
    {
        std::function<typename std::result_of<callable(arguments...)>::type()> task(std::bind(std::forward<callable>(f), std::forward<arguments>(args)...));

        execute = true;
        std::thread([this, interval, task]() 
        {
            while (execute)
            {
                task();
                std::this_thread::sleep_for(std::chrono::milliseconds(interval));
            }
        }).detach();

    }

    void Cancel()
    {
        execute = false;
    }

private:
    bool execute;
};

我想要实现的想法是调用成员类函数,如下面的代码片段所示:

    // separated thread
    void Processor::Run()
    {
        // start timer - call member class function every 100 ms
        Timer timer(100, this, &Processor::EvaluateData);

        Data datata;
        while (sharedQueData.Dequeue(data))
        {
            // preprocess data...

            std::lock_guard<std::mutex> lock(mutex);
            mVector.insert(data);
        }
    }

    // member class function to be called every 100 ms by timer
    void Processor::EvaluateData()
    {
       std::lock_guard<std::mutex> lock(mutex);
       // do anything with mVector
    }

该计划必须由VS 2013编制。

0 个答案:

没有答案