2012-01-02 20 views
12

私は2つのSYSTEMTIME変数の間に差をつけたいと思っています。誰かがこの質問を以前に聞いたのを見ましたが、彼は両方のSYSTEMTIME構造体をFILETIMEに変換するように言われました。 違いを得る別の方法はありますか?2つのSYSTEMTIME変数の違い

SYSTEMTIME st; 
GetSystemTime(&st); 

---ここではいくつかのコード---

SYSTEMTIME st2; 
    GetSystemTime(&st2); 

ST-ST2?

+2

です'? –

答えて

7

It says pretty clearly on the MSDN documentation

あなたが相対的な時間を得るために SYSTEMTIME構造から値を加算および減算することをお勧めしません。代わりに、する必要があります

  • FILETIME構造体にSYSTEMTIME構造体を変換します。
  • 結果のFILETIME構造体をULARGE_INTEGER構造体にコピーします。
  • ULARGE_INTEGER値に対して通常の64ビット演算を使用します。

なぜそれほど正確ではありませんか?あなたは誰もが推奨何とFILETIME `に` SYSTEMTIME`を変換することができないのはなぜ

+1

私はこれを避けたいと思っていました。しかし、私はあなたが提案したことをやります。私が作成した2つのULARGE_INTEGER構造をどのように控除しますか? – kakush

+0

これには64ビットのint型を使用できます。 MSDN(http://msdn.microsoft.com/en-us/library/aa383742(v=VS.85).aspx)にも記載されています。Cコンパイラは64ビット整数をネイティブにサポートしている場合があります。たとえば、Microsoft Visual C++は__int64サイズの整数型をサポートしています。詳細は、Cコンパイラに付属のマニュアルを参照してください。 – bobbymcr

5

FT1とFT2はFILETIME構造

ULARGE_INTEGER ul1; 
    ul1.LowPart = ft1.dwLowDateTime; 
    ul1.HighPart = ft1.dwHighDateTime; 

ULARGE_INTEGER ul2; 
    ul2.LowPart = ft2.dwLowDateTime; 
    ul2.HighPart = ft2.dwHighDateTime; 


ul2.QuadPart -= ul1.QuadPart; 

ミリ秒単位の違い...

ULARGE_INTEGER uliRetValue; 
    uliRetValue.QuadPart = 0; 


    uliRetValue = ul2; 
    uliRetValue.QuadPart /= 10; 
    uliRetValue.QuadPart /= 1000; // To Milliseconds 
19
SYSTEMTIME operator-(const SYSTEMTIME& pSr,const SYSTEMTIME& pSl) 
{ 
    SYSTEMTIME t_res; 
    FILETIME v_ftime; 
    ULARGE_INTEGER v_ui; 
    __int64 v_right,v_left,v_res; 
    SystemTimeToFileTime(&pSr,&v_ftime); 
    v_ui.LowPart=v_ftime.dwLowDateTime; 
    v_ui.HighPart=v_ftime.dwHighDateTime; 
    v_right=v_ui.QuadPart; 

    SystemTimeToFileTime(&pSl,&v_ftime); 
    v_ui.LowPart=v_ftime.dwLowDateTime; 
    v_ui.HighPart=v_ftime.dwHighDateTime; 
    v_left=v_ui.QuadPart; 

    v_res=v_right-v_left; 

    v_ui.QuadPart=v_res; 
    v_ftime.dwLowDateTime=v_ui.LowPart; 
    v_ftime.dwHighDateTime=v_ui.HighPart; 
    FileTimeToSystemTime(&v_ftime,&t_res); 
    return t_res; 
} 
+0

もしあなたの答えが本当に大きな時間を取ったように見えるのですが、それは数秒前に左に...していますか? SYSTEMTIMEはWORDメンバー(符号なし)で構成されているため、負の時差を表すことはできません。 –

関連する問題