C++ 使用clock()函数调度任务时出现问题
我希望以不同的时间间隔安排任务:0.1秒、0.9秒。。。。2s等 我使用时钟()C++函数,它返回模拟开始以来的滴答数,并且我用CcLoSsSpRySSEC将时钟号转换成秒,但是我注意到,当这个时刻是浮点时,任务并没有被调度,但是当它是整数时,它就不会被调度。这里是负责调度的代码部分:C++ 使用clock()函数调度任务时出现问题,c++,scheduled-tasks,precision,clock,C++,Scheduled Tasks,Precision,Clock,我希望以不同的时间间隔安排任务:0.1秒、0.9秒。。。。2s等 我使用时钟()C++函数,它返回模拟开始以来的滴答数,并且我用CcLoSsSpRySSEC将时钟号转换成秒,但是我注意到,当这个时刻是浮点时,任务并没有被调度,但是当它是整数时,它就不会被调度。这里是负责调度的代码部分: float goal = (float) clock() / CLOCKS_PER_SEC + 0.4 ; // initially (float) clock() / CLOCKS_PER_SEC = 0 ;
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秒钟内完成任务时,它就起作用了。这是精度问题吗 每秒时钟数在系统中是整数。在其他系统中,它也可以是浮动的。将(float)也放在它附近问题可能是因为您的浮点比较。这可能会产生意想不到的结果。请避免这种情况
<链接> < /p>
如果我在C++中实现了一些定时器机制,我可能会使用./P> 上面的示例将打印:
hello from foo hello from bar::hello Done! 福先生你好 酒吧里的你好 完成! 每两秒钟打印一行。在“完成!”
之后,程序将永远循环,什么也不做
请注意,此程序包含大量C++11功能,但已使用GCC4.4.5和4.7.1进行了测试。不幸的是,VC++2010没有
标题,但VC++2012RC显然有它。如果您想使用小于秒的分辨率,那么时钟
不是一个好的函数。我建议改为使用gettimeofday
。您可能不想在这里使用=
。如果由于某种原因,您的流程进入睡眠状态的时间刚刚够长,以至于无法实现您的目标,会发生什么情况?可能应该使用=
或
代替。感谢您的回复。我不能使用>或>=因为我必须在此时准确地安排任务。注意:您可以使用。谢谢你的回复。在我的例子中,它是一个等于1000000的整数注:@J.F.Sebastian好吧,明天当我有时间时,我会将它转换为使用std::chrono
。)这很好,但似乎计时器的粒度(检查更新的频率)应该是事件名称空间的一部分,或者整个事情应该封装在一个类中。
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!