以间隔为C 执行功能

Execute Functions on an Interval Basis C++

本文关键字:执行 功能      更新时间:2023-10-16

因此,我有一个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(可以说,从弱意义上说)并不是真正的实时系统,因此不能保证精确的时机。换句话说,您实现的实际间隔将有所不同。

仍然可以重组使用线程。从您的描述中,没有证据表明您真的需要这样的东西,所以我会在此回复。