以间隔为C 执行功能
Execute Functions on an Interval Basis C++
因此,我有一个Kinect程序,该程序具有三个主要功能来收集数据并保存数据。我希望其中一个功能能够尽可能地执行,而另外两个功能可能每秒运行10次。
while(1)
{
...
//multi-threading to make sure color and depth events are aligned -> get skeletal data
if (WaitForSingleObject(colorEvent, 0) == 0 && WaitForSingleObject(depthEvent, 0) == 0)
{
std::thread first(getColorImage, std::ref(colorEvent), std::ref(colorStreamHandle), std::ref(colorImage));
std::thread second(getDepthImage, std::ref(depthEvent), std::ref(depthStreamHandle), std::ref(depthImage));
if (WaitForSingleObject(skeletonEvent, INFINITE) == 0)
{
first.join();
second.join();
std::thread third(getSkeletonImage, std::ref(skeletonEvent), std::ref(skeletonImage), std::ref(colorImage), std::ref(depthImage), std::ref(myfile));
third.join();
}
//if (check == 1)
//check = 2;
}
}
目前,我的线程使它们在相同的确切时间内都运行,但是这会减慢我的计算机大大减慢,我只需要运行'getColorimage''和``getDepthimage''和'getDepthimage',也许是5-10次/秒,而'getskeletonimage'我想尽可能多地运行。
我想要以最大频率运行(〜30次/秒),然后将'getColorimage'和'getDepthimage'运行到时间同步(〜5-10次/秒)
我可以做什么?我已经在使用线程,但是我需要一个始终运行,然后其他两个可以间歇性地加入。谢谢您的帮助。
当前,您的主循环是创建 the the the the the the erses ersing everyter,这建议每个线程函数一次运行一次完成。这介绍了每次创建和破坏线程的开销。
就个人而言,我根本不会打扰线程。相反,在主线程中,我会做
void RunSkeletonEvent(int n)
{
for (i = 0; i < n; ++i)
{
// wait required time (i.e. to next multiple of 1/30 second)
skeletonEvent();
}
}
// and, in your main function ....
while (termination_condition_not_met)
{
runSkeletonEvent(3);
colorEvent();
runSkeletonEvent(3);
depthEvent();
}
这使事件交织在一起,因此skeletonEvent()
每次运行depthEvent()
和colorEvent()
时运行六次。只需根据需要调整数字即可获得所需的行为。
您需要为所有事件设计代码,以免它们随着时间的推移而运行(如果这样做,所有后续事件都将被延迟 - 无需停止)。
您需要解决的问题是如何等待时间发射骨骼事件。检索时钟时间,计算等待多长时间的过程,并为此间隔睡觉。通过睡觉(线程得出时间切片)您的程序也将有点更好(例如,它不会饿死其他处理器时间的过程)。
一个优点是,如果要在"事件"之间共享数据(例如,所有事件都会修改某些全局数据),则无需同步,因为上述循环可以保证只有一个"事件"访问共享共享的共享一次数据。
注意:您对WaitForSingleObject()
的使用表示您正在使用Windows。Windows(可以说,从弱意义上说)并不是真正的实时系统,因此不能保证精确的时机。换句话说,您实现的实际间隔将有所不同。
仍然可以重组使用线程。从您的描述中,没有证据表明您真的需要这样的东西,所以我会在此回复。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- QML按钮点击功能执行顺序
- 如何用共享库替换可执行C++程序的功能?
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 是否有一个Windows驱动程序函数可以执行Windows文件api SeFileAttributes的等效功能
- 如何使用C++在sqlite3数据库中执行写文件功能
- "no main"用于C++中链接或执行的功能
- 维护/维持两个代码集的风险,一个用于 CPU,一个用于 GPU,需要执行非常相似的功能
- 是否有用于执行反向字符串拆分器的开箱即用功能?
- 线程功能之一不执行可能的比赛条件
- C 程序如果功能中的语句不执行.在逻辑上似乎是错误的
- 无法从Linux,C ++执行"my_script" python脚本"main(filename)"功能;pModule = PyImport_Import(pName);返回空值
- 在地图中对匹配对执行功能
- 仅从受信任的库执行功能
- 如何重载iostream运算符以在整个流上执行功能
- 如何在QT中关闭子窗口后执行功能
- 以间隔为C 执行功能
- 对按钮事件执行功能
- 设置主机和执行功能有什么区别
- 在特定的时钟时间执行功能