C++ 便携式周期计时器,周期约为100ms

C++ 便携式周期计时器,周期约为100ms,c++,multithreading,cross-platform,C++,Multithreading,Cross Platform,嘿 我正在寻找一种在C++项目中周期性地调度任务的可移植方法。在这个特定的项目中,应该避免使用boost之类的库 分辨率要求并不太严格:一般上网本的分辨率在5Hz到20Hz之间 该项目使用OpenGL渲染HMI,但由于我正在处理后端部分,所以我对它不太熟悉 谢谢你的建议, 阿恩 编辑:我们的“任务”类实际上是使用CreateThread(..)for windows或pthread_create(..)for linux创建线程。我想你可以找到很多包含此类内容的库,比如/,但我认为这对你来说太难

我正在寻找一种在C++项目中周期性地调度任务的可移植方法。在这个特定的项目中,应该避免使用boost之类的库

分辨率要求并不太严格:一般上网本的分辨率在5Hz到20Hz之间

该项目使用OpenGL渲染HMI,但由于我正在处理后端部分,所以我对它不太熟悉

谢谢你的建议, 阿恩


编辑:我们的“任务”类实际上是使用CreateThread(..)for windows或pthread_create(..)for linux创建线程。

我想你可以找到很多包含此类内容的库,比如/,但我认为这对你来说太难了。我想您已经有了可以使用的库,如果它们包括可移植的多线程和无定期计时器,您可以自己设计一种简单的方法来实现这一点。如果计时要求较低,只需启动一个线程,该线程运行一个无限循环,该循环处于休眠状态,并在唤醒时调用回调方法。您可以使用来处理回调,因为它是轻量级的。如果您没有线程之类的,并且不想使用boost,您可以尝试一下。但如果你不想要boost,我想你也不会想要这么大的图书馆:——)


既然你已经知道了一整套目标系统,你就可以走这条路了。他们有完全相同的问题-他们使用的许多东西都依赖于系统


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

如果需要周期性触发器,一个在循环中休眠100ms的线程可能会起到作用。

实现这一点最简单的方法是在循环中使用休眠(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);
} 

目标平台的设置是否事先就知道了?当然知道:可能是windows xp和linuxubuntu@Arne你应该把这个澄清放在你的问题末尾,并在后面加上标记,然后删除你的评论。谢谢。事实上#定义受控编译正是目前正在发生的事情。我要寻找的是一种“隐藏”API,它允许在两个目标系统中设置线程的周期。恐怕我不得不推出自己的解决方案……你说的“隐藏”是什么意思?@sharptooth hidden的意思是“从MSDN上的API文档中看不明显”
void Sleep(unsigned long ulMilliseconds)
{
    struct timeval timeout;
    timeout.tv_sec = 0;
    timeout.tv_usec = ulMilliseconds * 1000;
    select(1, NULL, NULL, NULL, &timeout);
}