0

我已经在互联网上寻找了很长一段时间来寻找一个简单的解决方案来解决一个相当简单的问题。

我有这个函数作为一个线程运行,我想要的很简单。周围有很多伪代码解释了它是如何完成的,但是我在 C/C++ 中实现它时遇到了麻烦。

我想要什么:我有一个循环,我想每秒运行 20 次。我以前做过,但我一生都记不起来了。

这是我的代码。

void* Tick::startBeating() {
    mNext = clock();
    mRunning = 1;

    // Loop dat
    while (mRunning) {
        mT = clock();
        while ((mT) >= mNext) {
            // do updates here
            std::cout << "Tick." << std::endl;

            mNext = mT + SKIP_TICKS;
        }


        sleep(1);
    }

    return NULL;
}

这不起作用,似乎没有任何工作。C 语言中的简单解决方案在 Internet 上找不到,这让我感到惊讶。

是的,我知道 CLOCKS_PER_SEC,但我只是不知道了。

有什么帮助吗?

4

4 回答 4

1
  1. 在你工作之前,检查时间。

  2. 计算你应该运行下一个循环的时间。

  3. 做任何你需要做的事情。

  4. 计算距离您在步骤 2 中计算的时间还剩多少时间。

  5. 睡那么久。

  6. 转到步骤 1。

于 2012-07-17T10:19:37.267 回答
0

答案取决于所需的准确性。您提到您将函数作为单独的线程运行

  1. 你的线程除了检查时间和通知其他子系统关于滴答声外什么都不做(这意味着没有睡眠)while(1) if (elapsed_time >= target_time) flag=1
  2. 另一个功能(也许main())必须检查标志并做出响应while(1) if (thread.flag) {std::cout << "beat\n"; thread.flag=0;}
  3. 如果您的应用程序相当复杂,那么您应该实现信号/槽机制
于 2012-07-17T10:31:33.317 回答
0

我不确定您是否不知道如何在 C++ 中获得时间,或者您不知道步骤。

如果您在窗口中,要获得 MS 的时间。您可以使用 GetTickCount() 。资料如下。 http://msdn.microsoft.com/en-us/library/ms724408%28v=vs.85%29.aspx

.

.

如果您已经有时间但需要算法来完成它。对于如何以每秒 20 帧的速度执行的算法,我有一个准确但稍微难以理解的方法。

这是一个简短的伪代码。

CurrentTickCount = GetTickCount();

//CurrentTime 减去此循环结束时的上一个时间,得出到目前为止所用的时间

timeTakenSoFar += CurrentTickCount - PreviousTickCount;

//TickCount 是整数,毫秒值,因此这些毫秒中的 20 相当于 20/1000 秒,如果我记得或在这里做错了,这对你来说很容易解决:) while(timeTakenSoFar < 20)

{

PreviousTickCount = CurrentTickCount;

CurrentTickCount = GetTickCount();

timeTakenSoFar += CurrentTickCount - PreviousTickCount;

}

timeTakenSoFar -= 20;

// 基本上,PreviousTickCount 跟踪上次时间;

PreviousTickCount = CurrentTickCount;

//comment // 我没有将timeTakenSoFar 重置为0,因为肯定会有一点多余的时间,系统不能给你准确的20/1000,所以这会比等待解决方案更准确。在运行 10000000000 个周期后,这仍然会给你准确的时间,但不是等待方法。

于 2012-07-17T10:33:26.533 回答
0

我这样做

float mAccumulatedTime;
int mLastTime;

void Init()
{
  mAccumulatedTime = 0.f;
  mLastTime=clock();
}

void Tick(float DeltaTime)
{
  mAccumulatedTime += DeltaTime;
  while (mAccumulatedTime > FixedTimeStep)
  {
    DoFixedTimeStepStuff();
    mAccumulatedTime -= FixedTimeStep;
  }
}

void Update()
{
  int CurrentTime=clock();
  float DeltaTime=(CurrentTime-mLastTime)/(float)CLOCKS_PER_SEC;
  Tick(DeltaTime);
  mLastTime=CurrentTime;
}

您需要注意适当地处理 NaN 和“死亡螺旋”,但这足以让您开始。

于 2012-07-17T10:40:22.093 回答