2009-07-13 51 views
2

Hej!100ms周期的便携式周期性定时器

我正在寻找一种定期在C++项目中调度任务的可移植方式。在这个特定的项目中应避免使用诸如boost这样的库。

分辨率要求不是太严重:在平均上网本5Hz到20Hz之间。

该项目使用OpenGL来渲染HMI,但由于我在后端部分工作,我不太熟悉它。

感谢您的任何意见或建议, 阿恩

编辑:什么我们的“任务”类实际上做的是创建一个使用任何的CreateThread(..)用于Windows或在pthread_create(..)用于Linux的线程。

+0

目标平台是否预先知道? – sharptooth 2009-07-13 09:23:20

+0

当然是:windows xp和linux,可能是ubuntu – Arne 2009-07-13 09:42:36

回答

1

作为最简单的方法来实现这个目标是在一个周期内使用睡眠(100ms),您只需要一个便携式睡眠。对于Linux,它可以按如下方式实现:

void Sleep(unsigned long ulMilliseconds) 
{ 
    struct timeval timeout; 
    timeout.tv_sec = 0; 
    timeout.tv_usec = ulMilliseconds * 1000; 
    select(1, NULL, NULL, NULL, &timeout); 
} 
0

嗯,我认为你可以找到很多库,包括这种东西,如Glibmm/sigc++,但我认为这对你的指甲来说太大了。因为我想你已经有了库,如果它们包含可移植的多线程并且没有定期计时器,你可以设计一个简单的方法来自己完成。如果时序要求较低,只需启动一个运行死循环的线程,并在醒来时调用您的回调方法。您可以使用sigc++来处理您的回调,因为它是轻量级的。如果你没有线程等,也不想使用boost,你可以试试Glibmm。但如果你不想刺激我想你不会想这么大的图书馆没有:-)

my2cents. 
1

既然你已经知道了一套完整的目标体系,你可以去SQLite方式。他们有完全相同的问题 - 他们使用的很多东西都依赖于系统。

对于每个目标系统,所有依赖于系统的东西都是分别实现的,而正确的版本根据预处理器指令集进行编译。

1

如果你想要一个周期性的触发器,一个在循环中休眠100ms的线程可能会诀窍。