0

特定の値で始まり、のような別の値で終わるタイマーを作成しようとしています。

int pktctr = (unsigned char)unpkt[0];

if(pktctr == 2)
{
    cout << "timer-begin" << endl;
    //start timer here

}

if(pktctr == 255)
{
    cout << "timer-end" << endl;
    //stop timer here
    //timer display total time then reset.

}

cout << "displays total time it took from 1 to 255 here" << endl;

これを達成する方法について何かアイデアはありますか?

void WINAPI MyUCPackets(char* unpkt, int packetlen, int iR, int arg)
{
int pktctr = (unsigned char)unpkt[0];

if(pktctr == 2)
{
    cout << "timer-begin" << endl;

}

if(pktctr == 255)
{
    cout << "timer-end" << endl;

}

return MyUC2Packets(unpkt,packetlen,iR,arg);
}

この関数が呼び出されるたびに、unpktは2から始まり、最大255に達し、その後1に戻ります。そして、1回転ごとにどれくらいの時間がかかったかを計算したいですか?

これは何度も起こります。ただし、毎回同じになるとは限らないため、これが発生するまでに何秒かかったかを確認したかっただけです。

注:これはMSDetours3.0で行われます...

4

3 に答える 3

0

(コード内の)Windowsを使用していると仮定します。WINAPIその場合は、次を使用できますGetTickCount

/* or you could have this elsewhere, e.g. as a class member or
 * in global scope (yuck!) As it stands, this isn't thread safe!
 */
static DWORD dwStartTicks = 0;

int pktctr = (unsigned char)unpkt[0];

if(pktctr == 2)
{
    cout << "timer-begin" << endl;
    dwStartTicks = GetTickCount();
}

if(pktctr == 255)
{
    cout << "timer-end" << endl;

    DWORD dwDuration = GetTickCount() - dwStartTicks;

    /* use dwDuration - it's in milliseconds, so divide by 1000 to get
     * seconds if you so desire.
     */
}

注意点:オーバーフローが発生するGetTickCount可能性があります(約47日ごとに0にリセットされるため、ロールオーバー時間の近くでタイマーを開始すると、ロールオーバー後に終了する可能性があります)。これは2つの方法で解決できます。使用するGetTickCount64か、ロールオーバーまでのミリ秒数と、結果からdwStartTicks > GetTickCountのミリ秒数を計算し、それらの数値を合計します(これが可能な場合はボーナスポイント)。より賢い方法で)。dwStartTicks0GetTickCount()

または、この機能を使用することもできますclockhttp://msdn.microsoft.com/en-us/library/4e2ess30(v=vs.71).aspxで使用方法の例を含め、詳細を確認できます。コードに適応して統合します。

<chrono>最後に、より「標準的な」ソリューションに興味がある場合は、C++標準ライブラリのコンテンツを使用できます。例については、http://en.cppreference.com/w/cpp/chronoを確認してください。

于 2013-03-21T20:39:28.613 に答える
0

Windows-APIを使用する場合は、を使用しますGetSystemTime()。構造体を提供し、SYSTEMTIME適切に初期化して、次のアドレスに渡しますGetSystemTime()

#include <Windows.h>

 ...
 SYSTEMTIME sysTime;
 GetFileTime(&sysTime);
 // use sysTime and create differences

そこへのリンクもあるので、ここを見てください。GetSystemTime()SYSTEMTIME

于 2013-03-21T20:37:46.047 に答える
0

ブーストタイマーはあなたにとって最良の解決策だと思います。

次のように経過時間を確認できます。

#include <boost/timer.hpp>
int main() {   
boost::timer t; // start timing
 ...
 double elapsed_time = t.elapsed();
 ...
}
于 2013-03-21T20:40:02.290 に答える