0

私は長い間インターネットを調べて、かなり簡単な問題の簡単な解決策を探してきました。

私はこの関数をスレッドとして実行していますが、必要なのは非常に単純です。それがどのように行われるかを説明する疑似コードがたくさんありますが、C /C++でこれを実装するのに問題があります。

必要なもの:1秒間に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の簡単な解決策はインターネットのどこにもありません、そしてそれは私を驚かせます。

はい、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;

//コメント//timeTakenSoFarを0にリセットしませんでした。これは、確かにわずかな超過時間があり、システムが正確に20/1000を提供できないため、待機ソリューションよりも正確になります。10000000000サイクル実行した後でも、正確な正しい時刻が得られますが、waitメソッドでは得られません。

于 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 に答える