使用时钟调度任务时的问题()函数(Issue when scheduling tasks using

2019-06-17 16:42发布

我想在不同的时间间隔来调度任务:在0.1秒,0.9S .... 2S等我使用时钟()的C ++函数,因为模拟开始返回蜱的数目和我转换蜱数使用秒CLOCKS_PER_SEC,但我注意到,当瞬间是浮点任务没有计划,但是当它是一个整数,它的作用。 这里负责调度代码的部分:

float goal = (float) clock() / CLOCKS_PER_SEC + 0.4 ;  // initially (float) clock() / CLOCKS_PER_SEC = 0 ; 
if ((float) clock() / CLOCKS_PER_SEC == goal) 
     do stuff ; 

在这种情况下,这是行不通的,但是当我安排任务,以在3秒内,例如它的工作原理来完成。 它是精确度的问题?

Answer 1:

如果我是在实现C ++一些定时器机制,我很可能会使用std::chrono命名空间加上std::priority_queue

#include <functional>
#include <queue>
#include <chrono>
#include <sys/time.h>  // for `time_t` and `struct timeval`

namespace events
{
    struct event
    {
        typedef std::function<void()> callback_type;
        typedef std::chrono::time_point<std::chrono::system_clock> time_type;

        event(const callback_type &cb, const time_type &when)
            : callback_(cb), when_(when)
            { }

        void operator()() const
            { callback_(); }

        callback_type callback_;
        time_type     when_;
    };

    struct event_less : public std::less<event>
    {
            bool operator()(const event &e1, const event &e2) const
                {
                    return (e2.when_ < e1.when_);
                }
    };

    std::priority_queue<event, std::vector<event>, event_less> event_queue;

    void add(const event::callback_type &cb, const time_t &when)
    {
        auto real_when = std::chrono::system_clock::from_time_t(when);

        event_queue.emplace(cb, real_when);
    }

    void add(const event::callback_type &cb, const timeval &when)
    {
        auto real_when = std::chrono::system_clock::from_time_t(when.tv_sec) +
                         std::chrono::microseconds(when.tv_usec);

        event_queue.emplace(cb, real_when);
    }

    void add(const event::callback_type &cb,
             const std::chrono::time_point<std::chrono::system_clock> &when)
    {
        event_queue.emplace(cb, when);
    }

    void timer()
    {
        event::time_type now = std::chrono::system_clock::now();

        while (!event_queue.empty() &&
               (event_queue.top().when_ < now))
        {
            event_queue.top()();
            event_queue.pop();
        }
    }
}

使用时,只需使用添加事件events::add ,并调用events::timer几次每秒。

例:

void foo()
{
    std::cout << "hello from foo\n";
}

void done()
{
    std::cout << "Done!\n";
}

struct bar
{
    void hello()
        { std::cout << "Hello from bar::hello\n"; }
};

auto now = std::chrono::system_clock::now();
bar b;

events::add(foo, now + std::chrono::seconds(2));

events::add(std::bind(&bar::hello, b), now + std::chrono::seconds(4));

events::add(done, now + std::chrono::seconds(6));

while (true)
{
    usleep(10000);
    events::timer();
}

上面的例子将打印:

hello from foo
hello from bar::hello
Done!

一条线将被打印每两秒钟。 后"Done!" 该程序将只是永远循环下去,什么都不做。

请注意,此计划包含了许多C ++ 11的功能,但一直与GCC 4.4.5和4.7.1进行测试。 VC ++ 2010遗憾的是不具有<chrono>头,但VC ++ 2012RC显然有它。



Answer 2:

CLOCKS_PER_SEC是在您的系统整数。 在其他系统,也可能是太浮动。 把(浮动)附近的太



Answer 3:

这个问题可能是因为你的浮点比较。 这可以提供意想不到的结果。 请避免这种情况。

请参阅此链接



文章来源: Issue when scheduling tasks using clock() function