6

私はC++に比較的慣れていないので、あまり経験がありません。私はPythonを学び、C++で書いたPythonコードの改良版を作ろうとしています。ただし、リアルタイムで動作させたいので、Whileループの速度を設定する必要があります。答えはあると思いますが、見つかりませんでした。これに匹敵するコードが欲しい:

rate(timeModifier * (1/dt))

これは私がPythonで使用したコードでした。変数dtを設定して計算をより正確にし、timeModifierを設定して速度を2倍または3倍にすることができます(1はリアルタイムに設定します)。これは、プログラムが1秒あたり1/dt回ループを通過することを意味します。ヘッダーにtime.hを含めることができることは理解していますが、これをニーズに転送する方法を理解するには、C++に慣れていないようです。

4

6 に答える 6

7

独自のタイマークラスを作成できます。

#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 ++でタイマーを作成する方法の詳細については、このリンクを参照してください。

于 2012-05-18T13:39:22.817 に答える
4

C++でも同じように行うことはできません。SleepWindowsまたはusleep*NIXでは、計算ループである種のスリープ関数を手動で呼び出す必要があります。

于 2012-05-18T13:42:20.667 に答える
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から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())
}
于 2012-05-18T13:43:59.030 に答える
0

必要な精度とプラットフォームに応じて、次を使用できますusleep。これにより、一時停止時間をマイクロ秒に設定できます。

 #include <unistd.h>

 int usleep(useconds_t useconds);

ループの残りの部分に固有の処理時間があるため、ループは常にこれより長くかかることに注意してください。ただし、これは開始です。より正確なものについては、おそらくタイマーベースのコールバックを調べる必要があります。

于 2012-05-18T13:42:50.737 に答える
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;
}
于 2012-05-18T13:44:02.167 に答える
0

Windowsでは、 QueryPerformanceCounterを使用して、時間(たとえば、別のwhileループ内)呼び出しをポーリングしSleep(0)て、他のスレッドが操作を続行できるようにすることができます。

覚えておいてくださいSleep非常に不正確です。フルコントロールの場合は、操作なしでループを実行するだけですが、CPUを100%使用します。CPUの負担を軽減するために、Sleep(10)などを呼び出すことができます。

于 2012-05-18T14:25:49.100 に答える