C ++设置每秒循环的速度

时间:2012-05-18 13:32:07

标签: c++ loops time while-loop modifier

我对C ++比较陌生,所以我没有丰富的经验。我学习了Python,我正在尝试使用C ++编写的Python代码的改进版本。但是,我希望它能够实时工作,所以我需要设置While循环的速度。我确定有答案,但我无法找到答案。我想要一个类似的代码:

rate(timeModifier * (1/dt))

这是我在Python中使用的代码。我可以设置变量dt以使计算更精确,timeModifier可以设置速度的两倍或三倍(1将其设置为实时)。这意味着程序将以每秒1次/秒的速度循环。我知道我可以在标题中包含time.h,但我想我对C ++太新了解了解如何将其转换为我的需求。

6 个答案:

答案 0 :(得分:5)

您可以编写自己的计时器类:

#include <ctime>

class Timer {
    private:
        unsigned long startTime;
    public:
        void start() {
            startTime = clock();
        }

        unsigned long elapsedTime() {
            return ((unsigned long) clock() - startTime) / CLOCKS_PER_SEC;
        }

        bool isTimeout(unsigned long seconds) {
            return seconds >= elapsedTime();
        }
};


int main() 
{
    unsigned long dt = 10; //in seconds
    Timer t;
    t.start();

    while(true) 
    {
        if(t.elapsedTime() < dt) 
        {
            //do something to pass time as a busy-wait or sleep
        }
        else 
        {
            //do something else
                    t = Timer(); //reset the timer
        }
    }
}

请注意,不鼓励忙等待,因为它们会占用CPU。如果您不需要执行任何操作,请使用sleep命令(Windows)或usleep(Linux)。有关使用C ++创建计时器的更多信息,请参阅this link

答案 1 :(得分:3)

你不能在C ++中以同样的方式做到这一点。您需要在计算循环中手动调用某种睡眠功能,在Windows上Sleep或在* NIX上usleep

答案 2 :(得分:2)

我做了类似的事情已经有一段时间了,但是这样的事情会起作用:

#include <time.h>

time_t t2, t1 = time(NULL);

while(CONDITIONS)
{
    time_t t2 = time(NULL);
    if(difftime(t2, t1) > timeModifier)
    {
        //DO the stuff!
        t1 = time(NULL);
    }
}

然而,我应该注意到,我不熟悉这种方法的精确度,我认为它以秒为单位测量差异。

如果您需要更精确的内容,请使用clock()函数,该函数具有从1980年1月1日开始的12:00 AM以来的毫秒数,精确到10毫秒。 也许是这样的:

#include <time.h>

clock_t t2, t1 = clock();

while(CONDITIONS)
{
    t2 = clock();
    if((t2-t1) > someTimeElapsed*timeModifier)
    {
        //DO the stuff!
        t1 = clock());
    }
}

更新: 您甚至可以通过在if语句结束后添加它来将CPU提供给其他线程和进程:

else
{
    usleep(10000); //sleep for ten milliseconds (chosen because of precision on clock())
}

答案 3 :(得分:0)

根据您所需的准确度和平台,您可以使用usleep这可以将暂停时间设置为微秒:

 #include <unistd.h>

 int usleep(useconds_t useconds);

请记住,由于循环其余部分的固有处理时间,你的循环总是花费比这更长的时间,但这是一个开始。对于任何更准确的内容,您可能需要查看基于计时器的回调。

答案 4 :(得分:0)

你应该真正创建一个新线程并让它进行计时,这样它就不会受到循环中处理工作的影响。

警告:伪代码...只是为了让您了解如何开始。

Thread* tThread = CreateTimerThread(1000);
tThread->run();
while( conditionNotMet() )
{
    tThread->waitForTimer();
    doWork();
}

CreateTimerThread()应该返回你想要的线程对象,并且运行类似于:

run()
{
    while( false == shutdownLatch() )
    {
        Sleep( timeout );
        pulseTimerEvent();
    }
}

waitForTimer()
{
    WaitForSingleObject( m_handle );
    return;
}

答案 5 :(得分:0)

在Windows下,您可以使用QueryPerformanceCounter,同时轮询时间(例如在另一个while循环中)调用Sleep(0)以允许其他线程继续操作。

请记住Sleep非常不准确。对于完全控制,只需运行一个没有操作的循环,但是你将使用100%的CPU。为了缓解CPU上的压力,您可以拨打Sleep(10)等。