我对C ++比较陌生,所以我没有丰富的经验。我学习了Python,我正在尝试使用C ++编写的Python代码的改进版本。但是,我希望它能够实时工作,所以我需要设置While循环的速度。我确定有答案,但我无法找到答案。我想要一个类似的代码:
rate(timeModifier * (1/dt))
这是我在Python中使用的代码。我可以设置变量dt以使计算更精确,timeModifier可以设置速度的两倍或三倍(1将其设置为实时)。这意味着程序将以每秒1次/秒的速度循环。我知道我可以在标题中包含time.h,但我想我对C ++太新了解了解如何将其转换为我的需求。
答案 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)
等。