使用clock()函数调度任务时发出

我想在不同的时间间隔安排任务:在0.1秒,0.9s …. 2s等我使用clock()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秒内完成任务,例如它的工作。 这是一个精度问题?

如果我要在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(); } 

上面的例子将打印:

你好,来自foo
你好,来自bar :: hello
完成!

每两行打印一行。 "Done!" 该计划将永远循环,无所事事。

请注意,该程序包含许多C ++ 11function,但已经使用GCC 4.4.5和4.7.1进行了testing。 不幸的是,VC ++ 2010没有<chrono> chrono <chrono>头文件,但VC ++ 2012RC显然有它。

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

问题可能是因为你的浮点比较。 这可以提供意外的结果。 请避免这一点。

参考这个链接